【问题标题】:Form cleaning and processing not working - Django表单清理和处理不起作用 - Django
【发布时间】:2013-06-26 07:14:00
【问题描述】:

好的,这可能是一个非常明显的问题,我只是没有看到它,但我需要帮助:

在下面的视图中,我处理了一个表单集。 如果用户填写表格,我想保存EventRecordArticleHistory,如果用户将表格留空,我想保存ArticleHistory

def process_form(formset, request, current_page, paginator):
    if formset.is_valid():
        for form in formset.forms:
            form = form.cleaned_data

            ##### Check if user filled the form
            if form["relevance"] == False:
                pass
            elif form["relevance"] == True:

                ##### If user filled the form, save EventRecord

                event_form = EventRecordForm()

                event = event_form.save(commit=False)
                event.article = paginator.page(current_page).object_list[0]
                event.coder = request.user.coder
                event.last_updated = datetime.datetime.today()
                event.event_date = form["event_date"]
                event.location = form["location"]
                event.actors = form["actors"]
                event.num_participants = form["num_participants"]
                event.issue = form["issue"]
                event.side = form["side"]
                event.scope = form["scope"]
                event.part_violence = form["part_violence"]
                event.sec_engagement = form["sec_engagement"]
                event.save()

        ##### Add info on who worked on the article when
        history_form = ArticleHistoryForm()
        article_history = history_form.save(commit=False)
        article_history.article = paginator.page(current_page).object_list[0]
        article_history.coder = request.user.coder
        article_history.last_updated = datetime.datetime.now()
        article_history.save()

我尝试通过像这样清理表单来做到这一点:

class CodingForm(forms.Form):

    event_date = forms.DateField(required=False)
    location = forms.ModelChoiceField(queryset=Location.objects.all(), required=False)
    actors = forms.CharField(max_length=100, required=False)
    num_participants = forms.CharField(max_length=200, required=False)  
    issue = forms.CharField(max_length=200, required=False)
    side = forms.NullBooleanField('Side')
    scope = forms.TypedChoiceField(choices=SCOPE_CHOICES, coerce=int, empty_value=None)
    part_violence = forms.TypedChoiceField(choices=PART_VIO, coerce=int, empty_value=None)
    sec_engagement = forms.TypedChoiceField(choices=SEC_ENG, coerce=int, empty_value=None)
    relevance = forms.NullBooleanField('Relevance')

    def clean(self):
        cleaned_data = self.cleaned_data
        relevance = cleaned_data.get("relevance")
        event_date = cleaned_data.get("event_date")
        location = cleaned_data.get("location")

        if event_date and location:
            relevance = True
        else:
            relevance = False

        return cleaned_data

但是,如果我这样做 - 无论我做什么 - 只有 ArticleHistory 被保存,而没有 EventRecord
我错过了什么?

【问题讨论】:

    标签: django forms validation view


    【解决方案1】:

    在您的clean 方法中,您设置了一个名为relevance 的局部变量,但没有对其进行任何操作。我希望您希望将 cleaned_data['relevance'] 设置为 True 或 False。

    【讨论】:

    • 由于某种奇怪的原因,这不再起作用了。我按照您的建议更改了所有内容,并且效果很好。但是现在我在 process_form 中得到一个 KeyError "relevance": if form["relevance"] == False: 我该怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    相关资源
    最近更新 更多