【问题标题】:Why Form is not saving the many to many field value为什么表单不保存多对多字段值
【发布时间】:2016-03-26 16:09:18
【问题描述】:

代码的问题是表单已成功通过,但模型没有保存 Profile 模型中的多对多字段。 除食物和类型外,所有值都已保存。 请帮我写代码。 型号

class Relationship(models.Model):
    status = models.CharField(max_length =30)

    def __str__(self):
        return self.status

class Food(models.Model):
    food_name = models.CharField(max_length = 80)

    def __str__(self):
        return self.food_name

class City(models.Model):
    city = models.CharField(max_length = 80)

    def __str__(self):
        return self.city

class Type(models.Model):
    types = models.CharField(max_length =80)

    def __str__(self):
        return self.types

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL)
    avatar = models.ImageField(upload_to = image_upload_to)
    city = models.OneToOneField(City)
    fav_food = models.ManyToManyField(Food)
    relationship = models.OneToOneField(Relationship)
    preferrs = models.ManyToManyField(Type)

    def get_absolute_url(self):
         return reverse('chatbot')

    def __str__(self):
        return self.user.get_username()
`

我的模型形式如下

class ProfileForm(ModelForm):
    class Meta:
        model=Profile
        fields = ['avatar','city','fav_food','relationship','preferrs']

我的看法如下

def ProfileCreate(request):
    template="profile.html"
    context={}
    if request.user.get_username()=='':
        return redirect('account_login')
    if Profile.objects.all().filter(user__username=request.user.get_username()).count()>0:
        return redirect('chatbot')
    else:

        form = ProfileForm(request.POST ,request.FILES or None)

        if form.is_valid():

            new_profile = form.save(commit=False)

            user = User.objects.all().filter(username=request.user.get_username())[0]
            new_profile.user=user
            new_profile.save()
            return redirect('chatbot')

        context['form']=form


    return render(request,template,context)

【问题讨论】:

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


    【解决方案1】:

    由于您使用commit=False 保存表单,因此您必须在保存实例后调用表单的save_m2m 方法。

    new_profile = form.save(commit=False)
    # no need to fetch the user here, just use request.user
    new_profile.user = request.user
    new_profile.save()
    form.save_m2m()
    

    有关更多信息,请参阅model form save method 上的文档。

    【讨论】:

    • 谢谢,而不是 new_profile.save_m2m() 它将是 form.save_m2m()
    猜你喜欢
    • 2018-09-30
    • 1970-01-01
    • 2013-07-22
    • 2021-11-16
    • 2014-10-02
    • 2019-08-05
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多