首页 > 解决方案 > 表单集验证的 Django 问题

问题描述

我是 django 的新手,并且一直在努力解决这个问题。一位同事编写了一个手动发布函数来验证 is_valid()=true,我正试图通过覆盖 formset_valid 函数来使用内置验证,但它永远不会有效。

我有这个model.py:

class Assignment(PACSModel):
    course_id = models.IntegerField(unique = False)
    assignment_number = models.IntegerField(unique = False)
    assignment_name = models.CharField(max_length = 100)
    start_date = models.CharField(max_length = 10)
    due_date = models.CharField(max_length = 10)
    end_date = models.CharField(max_length = 10)

这个forms.py:

class AssignmentDatesForm(forms.ModelForm): 

class Meta:
    model = Assignment
    fields = [
    'assignment_number',
    'assignment_name',
    'start_date',
    'due_date',
    'end_date',
    ]

    widgets = { 'assignment_name' :forms.TextInput(attrs={'readonly':'readonly', 'class' : 'grey-text', 'size' : '25'}),
                'start_date' : forms.DateInput(format = '%m/%d/%Y', attrs ={ 'class' : 'datepicker'}),
                'due_date' : forms.DateInput(format = '%m/%d/%Y', attrs ={ 'class' : 'datepicker' }),
                'end_date' : forms.DateInput(format = '%m/%d/%Y', attrs ={ 'class' : 'datepicker' }),}

class Media:
    css = {'assignment_name': ('changeDates.css',)} 

AssignmentDatesFormSet = forms.modelformset_factory(
    model = Assignment,
    form = AssignmentDatesForm,
    extra = 0,
    ) 

手动遍历表单以显示:

         <table class = "table table-striped table-condensed table-hover"> 

            <thead >
                <tr>
                    <th>Assignment Number</th>
                    <th>Assignment Name</th>
                    <th>Start Date</th>
                    <th>Due Date</th>
                    <th>End Date</th>                   
                </tr>               
            </thead>
            <tbody> 
                {% for t in form %}
                <tr>
                    <td>{{ t.assignment_number }}</td> 
                    <td class = "inputA">{{ t.id }} {{ t.assignment_name }}</td>
                    <td>{{ t.start_date }}</td>
                    <td>{{ t.due_date }}</td>
                    <td>{{ t.end_date }}</td> 
                </tr>               
            {% endfor %}  

        </tbody>   

        </table> 

最后,视图是 ModelFormSetView 之上的一个类,我有这个简单的 post 函数来测试验证:

    def post(self, request, course_id, *args, **kwargs):
    logging.warning("In Post with course_id: " + course_id)
    formset = AssignmentDatesFormSet(request.POST)
    if formset.is_valid():
        logging.warning("Formset Saved")
        formset.save()
    logging.warning(vars(formset))
    return super(EditDueDates, self).post(request, course_id, *args, **kwargs)

这是一个简单的表单集,每个表单都是一个用户可以更改日期(开始日期、截止日期、结束日期)的作业。

我只是想让它验证,所以它会调用 formset_valid 并且我可以进行保存/后处理。但每次我为每种形式收到此错误时:

<ul class="errorlist"><li>id<ul class="errorlist"><li>Select a valid choice. That choice is not one of the available choices.</li></ul></li></ul>

我完全不明白。vars(formset) 转储有一个隐藏的 form-0-id 输入字段,其中设置了 id (pk)。我不明白为什么它不会说它是有效的。

更令人困惑的是,一位同事让它工作几乎完全相同,而且他不必包含 assignment_number 字段。它不需要显示,但如果我没有它,它会给出一个错误,它是必需的,这就是它被包含的原因。我们的表是相同的,并且 pgsql 中的所有字段都是必需的。

任何想法将不胜感激。我不知道去哪里诊断这个..

-将要

标签: pythondjangovalidationformset

解决方案


推荐阅读