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

nob*_*ody 1 python forms django many-to-many model

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

我有这些模型:

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')
Run Code Online (Sandbox Code Playgroud)

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

如果您需要更多信息,请告诉我,非常感谢.

cat*_*ran 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)
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用单个表单编辑配置文件与任何其他模型一样.你应该记住的唯一事情就是调用save_m2m()以防你覆盖表单的save()方法.

应用程序/ forms.py

from django import forms
from app.models import Profile

class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        widgets = {
            'categories': forms.CheckboxSelectMultiple,
        }
Run Code Online (Sandbox Code Playgroud)

应用程序/ 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
Run Code Online (Sandbox Code Playgroud)

模板/应用/ profile_form.html

<form action="" method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Create" />
</form>
Run Code Online (Sandbox Code Playgroud)

应用程序/ urls.py

from app.views import ProfileCreate

urlpatterns = patterns('',
    ...
    url(r'^profile/create/', ProfileCreate.as_view()),
)
Run Code Online (Sandbox Code Playgroud)

要更新配置文件,请使用具有相同类和模板的UpdateViewProfileForm.

编辑:如果您需要ProfileCategory模型中的其他字段,那么您可以将其设置为具有通过参数的中间模型ManyToManyField.要编辑此类模型,您必须使用formset.在这里,这里这里阅读更多相关信息.