【问题标题】:Django Forms manipulationDjango 表单操作
【发布时间】:2016-05-04 08:02:14
【问题描述】:

我现在正在处理一个充满大量错误的项目。我浏览了文章、文档、第三方插件等来帮助我,但我仍然缺少一些东西。 项目: 该项目是一个简单的单页网站,其末尾有一个表单供用户与我联系。

问题: 1.我需要为此创建一个模型吗?将用户填写表格的任何内容存储到数据库中是否可取? 2. 如何使用“forms.Form”而不是“forms.ModelForm”方法将用户输入写入数据库。

问题: 在我的表单中,我有一个“主题”选择,这取决于用户对“主题”的选择,显示更多要填写的表单。

  1. Django 仅当且仅当所有输入均已填写时才将整个表单标记为有效,但并非所有输入都应填写,因为有一个选项。

代码:

forms.py 
class ContactForm(forms.Form):
    first_name = forms.CharField(widget=forms.TextInput(
        attrs={'class': 'form-control', 'placeholder': 'First Name', 'id': 'first_name', 'name': "first_name"}),
                                 max_length=30, min_length=3,  required=True,label='')

    last_name = forms.CharField(widget=forms.TextInput(
        attrs={'class': 'form-control', 'placeholder': 'Last Name', 'id': 'last_name', 'name': "last_name"}),
                                required=True,label='')

    number = forms.IntegerField(widget=forms.NumberInput(
        attrs={'class': 'form-control', 'placeholder': 'Phone Number', 'id': 'num', 'label': '', 'name': "number"}),
        label='')

    email = forms.EmailField(widget=forms.EmailInput(
        attrs={'class': 'form-control', 'placeholder': 'Email', 'id': 'contact', 'label': '', 'name': "email"}),
                             required=True, label='' )

    subject_options = ('Subject', 'Book A Driver', 'Become A Driver', 'Ask A Question')

    topic = forms.ChoiceField(choices=[(x, x) for x in subject_options], widget=forms.Select(
        attrs={'class': 'form-control', 'placeholder': '', 'id': 'subject', 'label': '', 'name': "subject"}),
                              label='')

    feedback_options = ('Feedback Means', 'Call', 'Email', 'Email and Call')
    feedback = forms.ChoiceField(choices=[(x, x) for x in feedback_options], widget=forms.Select(
        attrs={'class': 'form-control', 'placeholder': '', 'id': 'feedback', 'label': '', 'name': "feedback"}),
                                 label='')

    plan_options = ('Plan', 'Hourly', 'Daily', 'Monthly', 'Event Plan')
    # plan = forms.ChoiceField(choices=[(x, x) for x in plan_options], widget=forms.Select(
    #     attrs={'class': 'form-control', 'placeholder': '', 'id': 'plan', 'label': ''}))

    enquiry_message = forms.CharField(widget=forms.Textarea(attrs={'class': 'form-control',
                                                                   'placeholder': 'Ask Us A Question', 'id': 'enquiry',
                                                                   'name': "enquiry"}), label='')

    driver_sex_option = ('Driver Sex ', 'Male', 'Female')
    driver_sex = forms.ChoiceField(choices=[(x, x) for x in driver_sex_option], widget=forms.Select(
        attrs={'class': 'form-control', 'placeholder': '', 'id': 'driver_sex', 'label': '', 'name': "driver_sex"}),
                                   label='')

    # driver_dress_options = ('Driver Dress', 'Casual', 'Official', 'Traditional', 'Any')
    # driver_dress = forms.ChoiceField(choices=[(x, x) for x in driver_dress_options], widget=forms.Select(attrs={'class': 'form-control', 'placeholder': '', 'id': 'driver_dress', 'label': '', 'name':"driver_dress"}) )

    payment_options = ('Payment Plans', 'Cash', 'Credit Card')
    payment = forms.ChoiceField(choices=[(x, x) for x in payment_options], widget=forms.Select(
        attrs={'class': 'form-control', 'placeholder': '', 'id': 'pay', 'label': ''}), label='')

    home_addres = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control',
                                                                'placeholder': 'Home Adress', 'id': 'address',
                                                                'name': "address"}))

    residence_options = ('Years of Residency in Lagos', '1', '2', '3', '4', '5', 'More than 5', 'More than 10')
    residence_years = forms.ChoiceField(choices=[(x, x) for x in residence_options],
                                        widget=forms.Select(
                                            attrs={'class': 'form-control', 'placeholder': '', 'id': 'residency',
                                                   'label': '', 'name': "residency"}))

    lasdri = forms.CharField(widget=forms.TextInput(
        attrs={'class': 'form-control', 'placeholder': 'LASDRI Certificate Number', 'id': 'certification',
               'name': "certification"}),label='')

    experience_options = ('Years of Experience', '1', '2', '3', '4', '5', 'More than 5', 'More than 10')
    experience_years = forms.ChoiceField(choices=[(x, x) for x in experience_options], widget=forms.Select(
        attrs={"class": 'form-control', 'placeholder': '', 'id': 'experience', 'label': '', 'name': "experience"}),
                                         required=True, label='')



views.py:

    def index(request):
        form = ContactForm
        if request.method == "POST":
            form = ContactForm(request.POST)
            if form.is_valid():
                first_name = form.cleaned_data['first_name']
                last_name = form.cleaned_data['last_name']
                number = form.cleaned_data['number']
                email = form.cleaned_data['email']
                subject = form.cleaned_data['topic']
                feedback = form.cleaned_data['feedback']
                enqiry = form.cleaned_data['enquiry_message']
                years = form.cleaned_data['experience_years']
                sex = form.cleaned_data['driver_sex']
                add = form.cleaned_data['home_addres']
                plan = form.cleaned_data['plan']
                pay = form.cleaned_data['pay' ]
                cert = form.cleaned_data['lasdri' ]
                residence = form.cleaned_data['residence_years']

                return HttpResponse('Done')



     `return render(request, 'information/index.html', {'form': form})`







template :


 ' {% csrf_token %}`<form action="" method="post" >


           {{ form }}
           <input type="submit" id="submit_btn" class="btn btn-info btn-lg" placeholder="Contact Us">`enter code here`
       </form>

除了上面提到的,如果有人知道我可以添加一些东西来使整个代码更好,我真的很感激。 我知道它很长。请原谅我。 谢谢。

我又使用了脆皮表格。它工作得很好,谢谢。 现在面临的问题是表单没有验证表单并使用数据库中的模型填充其值。 我已经编辑了 forms.py,但 views.py 仍然是一样的。我希望这可以帮助您帮助我弄清楚缺少什么

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    你有两个选择:

    一种是不需要表单定义中的字段,然后在表单的.clean() 方法中手动进行检查,具体取决于“主题”值。在客户端,当用户选择“主题”时,您需要使用 Javascript 隐藏/显示相应的字段。

    或者,您可以在 Django 中定义多个表单,一个对应“主题”列表中的每个值(继承自通用基本表单)。当用户选择一个“主题”时,该主题的相应表单将使用 Javascript 显示,而所有其他表单都将隐藏。使用这种方法,您可以在 Django 中定义所需的表单字段。

    我猜哪个更适合您的情况取决于您的“主题”列表有多长。

    【讨论】:

      【解决方案2】:

      答案 1:不。

      答案2:你可以看一下这个问题的标准文档:https://docs.djangoproject.com/es/1.9/topics/forms/#field-data

      问题和最后一个问题: 最好的方法是使用 Javascript 添加字段,然后在视图中添加字段,您可以获取请求并相应地处理它们。 我建议你使用crispy-forms。它确实大大简化了所有过程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-17
        • 2015-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多