python - 如何修复错误 "' id' : Select a valid choice"on Modelformset validation?

标签 python django django-models django-forms

我有一个 Modelformset 在提交时引发此验证错误:

{'id': ['Select a valid choice. That choice is not one of the available choices.']}



此错误出现的次数与我的查询集中的对象相同,即:
qs = Task.objects.filter(property=property)

在过去的几天里,我一直在努力解决这个问题。我已经阅读了很多其他类似的帖子并尝试了不同的解决方案,但没有一个对我有用。

我的表单集可以在这里看到:
def add_taskcheck(request, property_pk, pk):
    property = get_object_or_404(Property, pk=property_pk)
    pcheck = get_object_or_404(Propertycheck, pk=pk)
    qs = Task.objects.filter(property=property)
    tasks = Task.objects.filter(property=property_pk)

    TaskCheckFormset = modelformset_factory(TaskCheck, form=TaskCheckForm, fields=('status','image','notes'), extra=0)
    if request.method == 'POST':
        formset = TaskCheckFormset(request.POST, request.FILES, queryset=qs)
        print(formset.errors)
        if formset.is_valid():
            taskcheck = formset.save(commit=False)
            taskcheck.property_check=pcheck.id
            return HttpResponseRedirect(reverse('propertycheck:details', args=[pk]))
    else:
        formset = TaskCheckFormset(queryset=qs)

    context = {
        'title':"Add Property Check",
        'task':tasks,
        'reference':property_pk,
        'formset':formset,
    }
    return render(request, 'propertycheck/add-taskcheck.html', context)

还有我的表格:
class TaskCheckForm(forms.ModelForm):
    status = forms.ModelChoiceField(queryset=TaskStatus.objects.all(), to_field_name="name", widget=forms.Select(attrs={
    'class':'form-control custom-select',
    'id':'type',
    }))
    image = ...
    notes = ...

    class Meta:
        model = TaskCheck
        fields = ('status','image','notes')

最后是我的模型:
class TaskCheck(models.Model):
    status = models.ForeignKey(TaskStatus)
    image = models.ImageField(upload_to='task_check', blank=True, null=True)
    notes = models.TextField(max_length=500, blank=True)
    task = models.ForeignKey(Task)
    property_check = models.ForeignKey(Propertycheck)

class Task(models.Model):
    task = models.CharField(max_length=100, unique=True)
    category = models.ForeignKey(Categories)
    property = models.ManyToManyField(Property)

我已经知道问题与无关'状态' field 。其实我认为这与有关。 “任务” field 。我还添加了 {{ form.id }}到模板,正如我在其他一些问题上看到的那样。

供引用,我的模板:
{% csrf_token %}
{{ formset.management_form }}
{% for form in formset %}
{{ form.id }}
<div class="form-group">
      <h5 class="card-title">{{ form.instance.task }}</h5>
    <div class="row">
        <div class="col-md-3">
            <label for="pname">Status</label>
            {{ form.status }}
            {{ form.status.errors }}
        </div>
        <div class="col-md-3">
            <label for="pname">Image</label>
            {{ form.image }}
            {{ form.image.errors }}
        </div>
        <div class="col-md-3">
            <label for="pname">Notes</label>
            {{ form.notes }}
            {{ form.notes.errors }}
        </div>
    </div>
</div>
{% endfor %}

那么我做错了什么?

-------- 更新 ------------

根据 Oleg 的回答,我更改了表单集验证。
if request.method == 'POST':
        formset = TaskCheckFormset(request.POST, request.FILES, queryset=qs)
        if formset.is_valid():
            instances = formset.save(commit=False)
            for instance in instances:
                # do something with instance
                instance.property_check=pcheck.id
                instance.save()

最佳答案

这个问题是由于 ModelFormSet 和 QuerySet 中使用的不同模型引起的。
可以使用以下方法解决这些问题:

property = get_object_or_404(Property, pk=property_pk)
pcheck = get_object_or_404(Propertycheck, pk=pk)
qs = Task.objects.filter(property=property)
category = qs.values('category').distinct()
TaskCheckFormset = formset_factory(TaskCheckForm,extra=len(qs))

formset = TaskCheckFormset()
    for i in range(len(qs)):
        formset.forms[i].initial['task']=qs[i].id
        formset.forms[i].instance.task=qs[i]
        formset.forms[i].instance.property_check=pcheck
        formset.forms[i].initial['property_check']=pcheck.id

关于python - 如何修复错误 "' id' : Select a valid choice"on Modelformset validation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59600226/

相关文章:

python - django 序列化外键对象

python - 在 Django 的 models.py 中创建数据库时如何修复迁移错误?

python - 从/proc/net/tcp6 解析 IPv6 地址(python 2.7)

python - 按指定未排序顺序的第三个列表对列表列表进行排序

python - 关于多对多过滤和组合查询集的非常奇怪的行为

django - 如何避免将模型字段更新为最新时间戳时的竞争条件

python - 如何在 ModelSerializer 的 create 方法中实现 update_or_create

python - 如何转义 SPARQL 前缀名称中的特殊字符?

python - GAE 向所有事件实例发送请求

Python Social Auth Django 模板示例