【问题标题】:Django Forms: MultipleSelect with choices from another model (Foreign Key)Django Forms:MultipleSelect 与来自另一个模型的选择(外键)
【发布时间】:2015-08-12 16:39:17
【问题描述】:

我正在尝试创建一个表单,用户可以在其中选择多个技术人员。当我将行 technician = forms.SelectMultiple(label='Technicians Involved') 添加到我的 forms.py 时,我得到一个没有数据的大空白框。如何使用 User 模型中的技术人员填充该框?

models.py

class Incident(models.Model):
    user_id = models.ForeignKey(User, related_name='user')
    technician = models.ForeignKey(User, related_name='technician')
    capa = models.CharField('capa number', max_length=9)

forms.py

class IncidentForm(forms.ModelForm):

    ###################### TRYING! ################################
    technician = forms.SelectMultiple(label='Technicians Involved')
    ###############################################################

    class Meta:
        model = Incident
        fields = [  'user_id',
                    'technician',
                    'capa',
                ]

views.py

def report_incident(request):

    template = "report.html"

    if request.method == 'POST':

        form = IncidentForm(request.POST)

        if form.is_valid():

            # Auto capturing logged in user
            incident = form.save(False)
            incident.user_id = request.user
            incident.save()
            return HttpResponseRedirect('/incidents/')
    else:
        form = IncidentForm() #an unbound form

        return render(request, template, {'form': form})

************** 我在下面做的更正更新 ******************** *

models.py

class Incident(models.Model):
    user_id = models.ForeignKey(User, related_name='user')
    technician = models.ManyToManyField(User, related_name='technician')
    capa = models.CharField('capa number', max_length=9)

forms.py

class IncidentForm(forms.ModelForm):

    technician = forms.SelectMultiple()

    class Meta:
        model = Incident
        fields = [  'user_id',
                    'technician',
                    'capa',
                ]

views.py 没有变化

admin.py 为在管理界面中查看每个事件的多个技术人员所做的更改。

class IncidentAdmin(admin.ModelAdmin):
        list_display = ('id',
                        'user_id',
                        'capa',
                        'get_technicians'
                        )

       def get_technicians(self):
            return "\n".join([t.technicians for t in obj.technician.all()])

【问题讨论】:

  • 您想为一个事件选择多个技术人员,但每个事件对象只能有一个技术人员(而一个技术人员可以有多个事件)。还是我这里有什么问题?
  • 正确。我将自己限制在哪里,事件对象只能有一名技术人员?
  • 你使用外键限制了它——你需要多对多
  • 我认为他想要多对多......否则你会制造一个新问题,用户只能有一个事件
  • @Anentropic 是的,你是对的!

标签: django forms multiple-select


【解决方案1】:

试试这个

class IncidentForm(forms.ModelForm):
   technician = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple(), queryset=User.objects.all())

     class Meta:
        model = Incident
        fields = [
                'technician',
                'capa',
               ]

【讨论】:

  • 没有骰子。我从SelectMultiple 中取出了u,并用左括号替换了逗号。
  • 'User' object is not iterable。我将在我的 models.py 中使用多对多
  • 我编辑了我的答案以使用您的修订版,并发现这效果更好,因为您在 forms.py 上面的内容只是使用模型中的默认字段 forms.ModelForm 结束供应。 SelectMultiple 是一个小部件,而不是表单字段。对不起,我的第一个答案是没有计算出来的,浪费了你的时间。
  • 现在看起来差不多......虽然您应该在表单上包含所有字段,因为它们目前在模型级别都是必需的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
相关资源
最近更新 更多