【问题标题】:Django form field updateDjango 表单字段更新
【发布时间】:2018-04-17 19:46:05
【问题描述】:

我有一个 Django 表单,它允许用户从多个标签选项中选择一个标签。我面临的问题是,即使标签列表得到更新,模型表单也不会从数据库中获取更新的标签列表。因此,新标签不会出现在选项中。

这是我在 forms.py 中的代码:

class EnglishTagForm(forms.Form):
    tag_choices = [(x.tagName, x.tagName.upper()) for x in ClassTag.objects.filter(
                     agentId=Agent.objects.get(name='English Chowdhury'))]
    tag = forms.CharField(widget=forms.Select(choices=tag_choices, 
                     attrs={'class':'form-control'}))

def __init__(self, *args, **kwargs):
    super(EnglishTagForm, self).__init__(*args, **kwargs)
    self.fields['tag'].choices = [(x.tagName, 
                           x.tagName.upper()) for x in ClassTag.objects.filter(
                           agentId=Agent.objects.get(name='English Chowdhury'))]

此表单正在视图中实例化。我的问题是我应该做哪些更改,以便 tag_choices 在每次实例化时从数据库中更新。

views.py中如何使用上述表单:

```

def complaintDetail(request, complaint_id):

    complaint = Complaints.objects.filter(pk=complaint_id).first()
    context = {}

    if request.method == 'POST':
        agent = Agent.objects.get(name="English Chowdhury")

        if "SubmitTag" in request.POST:
            englishForm = EnglishTagForm(request.POST)

            if englishForm.is_valid:
                // Complaint Delete Logic
                return redirect('chatbot:modComplaints')
            else:
                englishForm = EnglishTagForm()
                context['eForm'] = englishForm
        elif "SubmitBundle" in request.POST:
            newTagForm = NewTagForm(request.POST)

            if newTagForm.is_valid():
               // Complaint Delete Logic

                complaint.delete()
                return redirect('chatbot:modComplaints')
            else:
               newTagForm = NewTagForm()
               context['newForm'] = newTagForm
    else:
        englishForm = EnglishTagForm()
        context['eForm'] = englishForm
        newTagForm = NewTagForm()
        context['newForm'] = newTagForm
    context['complaint'] = complaint
    return render(request, 'chatbot/complaintDetail.html', context) 

```

编辑:(供将来参考) 我决定修改tag属性并将CharField转换为ModelChoiceField,这似乎解决了这个问题。

更新类:

class EnglishTagForm(forms.Form):
    tag = forms.ModelChoiceField(queryset=ClassTag.objects.filter(
        agentId=Agent.objects.get(name='English Chowdhury')), 
        empty_label=None, widget=forms.Select(
        attrs={'class':'form-control'}))

【问题讨论】:

  • 你能告诉我们你是如何在视图中使用这个类的吗?
  • 我已经添加了我使用@AniruddhaAdhikary 表单的部分

标签: python django database django-forms


【解决方案1】:

请从第 2 行删除列表推导式。这样,

tag_choices = [(x.tagName, x.tagName.upper()) for x in ClassTag.objects.filter(
                 agentId=Agent.objects.get(name='English Chowdhury'))]

变成

tag_choices = []

【讨论】:

  • 那行不通。我得到了空的选择列表。