多对多关系的表单,创建和更新视图

时间:2015-01-25 21:12:00

标签: python django forms model many-to-many

这是我在这里的第一个问题而且我正在写作,因为即使在阅读了文档和大量答案之后,我也对此感到很生气。非常感谢你,抱歉我的英语不好!

我有这些模特:

class Profile(models.Model):
    name = models.CharField(max_length = 255, blank = False)
    user = models.ForeignKey(User, blank = True, null = True)

class Category(models.Model):
    name = models.CharField(max_length = 50, blank = False)

class ProfileCategory(models.Model):
    profile = models.ForeignKey(Profile)
    category = models.ForeignKey(Category)

    class Meta:
        unique_together = ('profile', 'category')

这个型号是否正确? 我想已经保存了类别的数据库。我需要一个页面,用户可以在其中创建新的配置文件,并从复选框列表中选择类别。我应该在同一页面中使用两个表单,一个用于配置文件,一个用于选择类别还是单个表单?我想我需要一个ModelMultipleChoiceField用于类别。 我还需要一个视图,显示已经填充了配置文件的相同表单以及用户可以更改配置文件名称的类别,以及添加或删除类别。

告诉我您是否需要更多信息并非常感谢。

1 个答案:

答案 0 :(得分:5)

这里不需要

ProfileCategory模型。使用ManyToMany字段可以获得相同的结果:

class Category(models.Model):
    name = models.CharField(max_length=50, blank=False)

class Profile(models.Model):
    name = models.CharField(max_length=255, blank=False)
    user = models.ForeignKey(User, blank=True, null=True)
    categories = models.ManyToManyField(Category, blank=True)

现在,您可以使用单个表单编辑配置文件,就像任何其他模型一样。您唯一应该记住的是,如果您覆盖表单的save()方法,请致电save_m2m()

应用/ forms.py

from django import forms
from app.models import Profile

class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        widgets = {
            'categories': forms.CheckboxSelectMultiple,
        }

应用/ views.py

来自django.views.generic.edit导入CreateView

from app.forms import ProfileForm
from app.models import Profile

class ProfileCreate(CreateView):
    form_class = ProfileForm
    model = Profile

<强>模板/应用/ profile_form.html

<form action="" method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Create" />
</form>

应用/ urls.py

from app.views import ProfileCreate

urlpatterns = patterns('',
    ...
    url(r'^profile/create/', ProfileCreate.as_view()),
)

要更新个人资料,请使用UpdateViewProfileForm类和模板。

编辑:如果您需要ProfileCategory模型中的其他字段,则可以将其设置为ManyToManyField的{​​{3}}参数的中间模型。要编辑此类模型,您必须使用formset。详细了解throughherehere