【问题标题】:Django post manytomany field with formDjango 使用表单发布多态字段
【发布时间】:2017-08-01 13:04:00
【问题描述】:

我尝试选择poi(point of interest)来制作loi(line of interest),在多对多领域遇到了两个问题:

1.为什么我不能发布多个选择的选项。

2.如何将选项中的名称更改为我想要的名称(例如POI_title) original name/image

Model.py

class POI(models.Model):
    user = models.ForeignKey(User,on_delete = models.CASCADE)
    poi_id = models.AutoField(primary_key=True)
    POI_title = models.CharField(max_length=10)
    def __unicode__(self):
        return "{}({})".format(self.POI_date, self.user)

class LOI(models.Model):
    user = models.ForeignKey(User,on_delete = models.CASCADE)
    poi = models.ManyToManyField(POI)
    LOI_title = models.CharField(max_length=10)
    loi_id = models.AutoField(primary_key=True)

Form.py

 class LOIForm(forms.ModelForm):
 class Meta:
    model = models.LOI
    fields = ['poi','LOI_title']
    def __init__(self, user, *args, **kwargs):
        super(LOIForm,self).__init__(*args, **kwargs)
        self.fields['poi'].widget = forms.widgets.CheckboxSelectMultiple()
        self.fields['LOI_title'].label= 'title'

Views.py

 if request.method == 'POST':
    request.POST.get("name", request.user.username)
    loi_form = forms.LOIForm(request.POST)
    if loi_form.is_valid():
        loi_form = loi_form.save(commit=False)
        loi_form.user = request.user
        loi_form.save()
        return HttpResponseRedirect('/make_LOI')

模板

<table>
   {% for p in loi_form.poi %}
       <tr>{{p}}</tr>
   {% endfor%}
</table>

【问题讨论】:

  • 你需要解释更多问题

标签: python django django-1.10


【解决方案1】:
  1. 您在form.save() 中使用commit=False。在这种情况下,您需要在loi_form.save() 之后添加loi_form.save_m2m() 以保存多对多字段。

  2. __unicode__ 函数中,您将返回self.POI_date, self.user,它显示了图像中的结果。而是使用:

    def __str__(self):
        return self.POI_title
    

__unicode__ 在 python2 中使用,只使用 __str__ 就足够了。移除__unicode__函数。

【讨论】:

  • 对了,为什么self.fields['poi'].widget = forms.widgets.CheckboxSelectMultiple() 没有从原始图片切换到复选框?
  • 首先,您在哪里进行此更改?它需要在表单的__init__ 函数中完成,或者直接在表单项中完成(在class Meta 之前)。也只写forms.CheckboxSelectMultiple()就够了,不需要forms.widgets
  • 另外你在 Meta 里面写了__init__ 函数,这是不正确的。它应该在LOIForm 内(与class Meta: 在同一行)
猜你喜欢
  • 1970-01-01
  • 2012-01-27
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多