Django - это поле обязательно для заполнения ошибка - PullRequest
0 голосов
/ 16 мая 2018

Я новичок в 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 --->

класс 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'),)))

Я могу напечатать значения и увидеть, что они переданы, но я все еще получаю следующую ошибку:

Описание ошибки

Я удалил все внешние ссылки на таблицы, поля - это простые символьные поля.

Пожалуйста, помогите мне.

Спасибо.

1 Ответ

0 голосов
/ 16 мая 2018

Во-первых, проверка вашей формы не удалась.Мне кажется, что ваш шаблон формы может быть неправильным.

Во-вторых, вы не правильно используете формы 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()
    

Вот и все!Я надеюсь, что я вам помог.

Ура!

...