【问题标题】:Django M2M field in a Model Form?模型表单中的 Django M2M 字段?
【发布时间】:2020-03-30 12:18:50
【问题描述】:

我的模型中有一个多对多字段ConnectedTo,我想使用表单创建对象。但是,当我将其列为字段时,我只会得到一个列表框,其中包含要突出显示的选项,而无法选择一个或多个。

理想情况下,我会喜欢一个多选复选框,其中包含滚动框中的项目列表。但我会从一个可选择的项目开始。

到目前为止,这是我的代码:

models.py:

class Part(models.Model):
    PartID = models.AutoField(primary_key=True, unique=True)
    SiteID = models.ForeignKey('Site', on_delete=models.CASCADE, null=True)
    Comment = models.CharField(max_length=255, blank=True)
    Subtype = models.ForeignKey('Subtype', on_delete=models.CASCADE, null=True)
    Location = models.CharField(max_length=255, blank=True)
    ConnectedTo= models.ManyToManyField('self', blank=True, null=True)
    BatchNo = models.CharField(max_length=32, blank=False, null=True)
    SerialNo = models.CharField(max_length=32,blank=True)
    Manufacturer = models.CharField(max_length=32, blank=False, null=True)
    Length = models.CharField(max_length=6, blank=True, null=True)
    InspectionPeriod = models.IntegerField(blank=True, null=True)
    LastInspected = models.DateField(blank=True, null=True)
    InspectionDue = models.CharField(max_length=255, blank=True)

    @classmethod
    def create(cls, siteid, comment, subtype, location, batchno, serialno, manufacturer, length, inspectionperiod, lastinspected, inspectiondue):
        part = cls(SiteID = siteid, Comment = comment, Subtype = subtype, Location = location, BatchNo = batchno, SerialNo = serialno, Manufacturer = manufacturer, Length = length, InspectionPeriod = inspectionperiod, LastInspected = lastinspected, InspectionDue = inspectiondue)
        return part

    def __str__(self):
        return str(self.PartID)

forms.py:

class PartForm(forms.ModelForm):

    class Meta:
        model = Part
        fields = ('Comment', 'Subtype', 'Location', 'ConnectedTo', 'BatchNo', 'SerialNo', 'Manufacturer', 'Length', 'InspectionPeriod', 'LastInspected')

views.py:

@login_required(login_url='/accounts/login/')
def addPartForm_Create(request, site, subtype):
siteselected = site
subtypeselected = Subtype.objects.get(SubtypeID = subtype)
if request.method == 'POST':
    form = addPartForm(request.POST)
    if form.is_valid():
        obj = form.save(commit=False)
        obj.SiteID = Site.objects.get(SiteID = siteselected)
        obj.Subtype = subtypeselected
        obj.save()
        return redirect('/sites/'+str(site))
else:
    form = addPartForm()
return render(request, 'myproj/addPart.html', {'form': form, 'SiteNo': Site.objects.get(SiteID = siteselected).SiteID, 'subtype': subtypeselected})

编辑:观点有误,抱歉。

编辑 2:我所说的突出显示框的示例:

更新:

Jey_Jen 的回答帮助我获得了我想要的风格。我现在有一个多选复选框。但 ConnectedTo 属性不保存。保存模型中的所有其他内容并创建一个新零件。但没有多对多链接。

【问题讨论】:

  • “突出显示的选项”选择它们,确定吗?
  • 不,不是。我附上了截图以进一步澄清
  • @DanielRoseman 我还检查了我的数据库表,以澄清在后台没有建立连接关系,以防我的 html 没有显示任何发生的事情。看起来那个盒子的引擎盖下绝对没有发生任何事情。
  • 就像我说的,这是你可以选择的;这是浏览器呈现多选的默认方式(即<select type="multiple">。)

标签: python django django-models django-forms django-views


【解决方案1】:

我建议研究 django 表单小部件。您可以将默认小部件覆盖为您想要的任何东西。你可以查看他们here

这是 django 文档给出的一个小例子:

class CommentForm(forms.Form):
    name = forms.CharField()
    url = forms.URLField()
    comment = forms.CharField(widget=forms.Textarea)

【讨论】:

  • 我想到了这一点,但它似乎与以模型形式执行它不同?这也一样吗?
  • 应该是类似的。你可以在这里看到一个关于它如何与模型表单一起工作的简短描述:stackoverflow.com/questions/9878475/…
  • 我试过这样做,但它似乎没有覆盖它,它仍然是一个列表框:class Meta: ... widgets = {'ConnectedTo': forms.CheckboxSelectMultiple()}
  • 没关系,我只是个白痴,把它放在错误的 Meta 类中哈哈
  • 添加到这个答案以获得最终解决方案。我必须在 obj.save() 行下添加 form.save_m2m() 以保存 m2m 链接。
猜你喜欢
  • 1970-01-01
  • 2011-03-02
  • 2011-03-07
  • 2019-08-09
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2020-11-30
相关资源
最近更新 更多