【问题标题】:Django - This is field is required errorDjango - 这是必填字段错误
【发布时间】:2018-05-16 10:56:02
【问题描述】:

我是 Django 新手,正在尝试将表单中的一些数据保存到模型中。我想插入两个具有外键约束关系的模型(即 Idea 和 IdeaUpvotes),即从 html 模板到视图。

我的提交代码是:

def submitNewIdea(request):
    #get the context from the request
    context = RequestContext(request)

    print(context)

    #A HTTP POST?
    if request.method == 'POST':
        form = submitNewIdeaForm(request.POST)


        # Have we been provided with a valid form?
        if form.is_valid():
            # Save the new Idea to the Idea model

            print(request.POST.get("IdeaCategory"))
            print(request.POST.get("IdeaSubCategory"))


            i = Idea(   idea_heading = form["idea_heading"].value()
                        ,idea_description = form["idea_description"].value()
                        ,idea_created_by = form["idea_created_by"].value()
                        ,idea_votes = form["idea_votes"].value()
                        ,idea_category = request.POST.get("IdeaCategory") #value from dropdown
                        ,idea_sub_category = request.POST.get("IdeaSubCategory")  #value from dropdown
                     )

            i.save()
            # get the just saved id

            print(Idea.objects.get(pk = i.id))

            iu = IdeaUpvotes(idea_id = Idea.objects.get(pk = i.id)
                            ,upvoted_by = form["upvoted_by"].value()
                            ,upvoted_date = timezone.now() )

            iu.save()
            form.save(commit = True)
            # Now call the index() view.
            # The user will be shown the homepage.
            return index(request)
        else:
            # The supplied form contained errors - just print them to the terminal.
            print (form.errors)
    else:
        # If the request was not a POST, display the form to enter details.
        form = submitNewIdeaForm()

    # Bad form (or form details), no form supplied...
    # Render the form with error messages (if any).
    return render(request,'Ideas/Index.html',{'form' :form})

form.py --->

class submitNewIdeaForm(forms.ModelForm):

idea_heading = forms.CharField(label = "idea_heading",max_length =1000,help_text= "Please enter the idea heading.")
idea_description= forms.CharField(label = "idea_description",max_length =1000,help_text= "Please enter the idea description.",widget=forms.Textarea)
idea_created_by=forms.CharField(max_length =200, widget = forms.HiddenInput(), initial='wattamw')
idea_votes = forms.IntegerField(widget=forms.HiddenInput(), initial=1)
upvoted_by=forms.CharField(max_length =200, widget = forms.HiddenInput(), initial='abcde')

"""
#commented code

#idea_category_name = forms.CharField(label = "idea_category_name",max_length =250,help_text= "Please select an Idea Category.")
#idea_sub_category = forms.CharField(label = "idea_sub_category",max_length =250,help_text= "Please select an Idea Sub Category.")

idea_category_name = forms.ModelChoiceField(
                    queryset = IdeaCategory.objects.all(),
                    widget=autocomplete.ModelSelect2(url='category-autocomplete'))


idea_sub_category = forms.ModelChoiceField(
                    queryset = IdeaSubCategory.objects.all(),
                    widget = autocomplete.ModelSelect2(
                        url='subcategory-autocomplete',
                        forward = (forward.Field('idea_category_name','id'),)))
"""


class Meta:
    model = Idea
    fields = ('idea_heading','idea_description','idea_created_by','idea_votes','idea_category_name','idea_sub_category')

class Meta:
    model = IdeaUpvotes
    fields = ('upvoted_by',)

def __init__(self,*args,**kwargs):
    super(submitNewIdeaForm,self).__init__(*args,**kwargs)
    self.fields['idea_category_name'] = forms.ModelChoiceField(
                                        queryset = IdeaCategory.objects.all(),
                                        widget=autocomplete.ModelSelect2(url='category-autocomplete'))
    self.fields['idea_sub_category'] = forms.ModelChoiceField(
                                    queryset = IdeaSubCategory.objects.all(),
                                    widget = autocomplete.ModelSelect2(
                                    url='subcategory-autocomplete',
                                    forward = (forward.Field('idea_category_name','id'),)))

我能够打印这些值并看到它们已通过,但我仍然收到以下错误:

Error Description

我已经删除了对表的所有外键引用,这些字段是简单的字符字段。

请帮帮我。

谢谢。

【问题讨论】:

  • 请将错误以文本形式发布。我的代理阻止查看图像。
  • 先正确使用表单怎么样?
  • 错误是“idea_category name”,需要“idea_sub_category_name”。

标签: django django-forms django-views


【解决方案1】:

首先,您的表单验证失败。在我看来,您的表单模板可能是错误的。

第二件事是你没有正确使用 Django 表单。要实现您正在寻找的功能,您需要做的就是使用ModelForm 并让表单的save 方法为您创建对象。您需要做的就是:

  1. 将您的 SubmitNewIdeaForm 与 Idea 模型相关联:

        # forms.py
        class SubmitNewIdeaForm(ModelForm):
            class Meta:
            model = Idea
            fields = (
                'idea_heading',
                'idea_description',
                'idea_created_by',
                'idea_votes',
                'idea_category',
                'idea_sub_category'
            )
    
  2. 渲染表单

    #form_template.html
    <form action="{% url 'your_url' %}" method="post">
        {% csrf_token %}
        {{ form }}
        <input type="submit" value="Submit" />
    </form>
    
  3. 最后检查表单是否有效并像这样调用form.save():

    def submitNewIdea(request):
        if form.is_valid():
            form.save()
    

就是这样!希望对你有所帮助。

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 2020-10-15
    • 1970-01-01
    • 2016-04-29
    • 2020-06-02
    相关资源
    最近更新 更多