Django以形式发布manytomany字段

时间:2017-03-11 03:30:54

标签: python django django-1.10

我试图选择poi(兴趣点)来制作loi(兴趣点),我在很多很多领域遇到了两个问题:

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>

1 个答案:

答案 0 :(得分:0)

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

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

    def __str__(self):
        return self.POI_title
    
  3. 在python2中使用了

    __unicode__,仅使用__str__就足够了。删除__unicode__功能。