【问题标题】:Stuck on linking ManytoMany relationships with Modelform坚持将多对多关系与 Modelform 联系起来
【发布时间】:2019-10-18 23:01:01
【问题描述】:

我对 Django 很陌生,我正在从事一个目前需要以下内容的项目:

我有两个基本结构:Project 模型和 TeamMember 模型——两者都通过多对多关系相互关联。然后我有一个 TMAAssigned 'through' 类。随着时间的推移,团队成员将分配许多项目。

我有一个 ModelFrom,它通过创建表单来创建一个项目模型。

我的问题是,如何在提交表单后将团队成员链接到新创建的项目?

这是我的一些模型和表单代码:

团队成员

class TeamMember(models.Model):
    firstname = models.CharField(max_length=100, default= "First Name")
    lastname = models.CharField(max_length=100, default= "Last Name")
    fullname = models.CharField(max_length=100, default= "Full Name")
    email = models.EmailField(max_length=254)
    cellphone = PhoneNumberField(null=False, blank=False, unique=True)
    numberofcases = models.IntegerField(max_length=10000, default=0)

    @property
    def fullnamefunc(self):
        fullname = "{} {}".format(self.firstname, self.lastname)
        return fullname

    def __str__(self):
        return self.fullname

项目

class Project(models.Model):
    pursuitname = models.CharField(max_length=500)
    datecreated = models.DateTimeField(auto_now=True)
    bdmember = models.ManyToManyField('team.TeamMember')

Views.py

class bdFormView(TemplateView):
    template_name = os.path.join(BASE_DIR, "templates/masterform/bdform.html")

    def get(self,request):
        form = bdForm()
        return render (request, self.template_name, {'form': form})

    def post(self, request):
        form = bdForm(request.POST)

        if form.is_valid():
            print("form is valid")

            project = form.save(commit=False)
            project.save()
            text = form.cleaned_data['briefcard']

Form.py

class bdForm(forms.ModelForm):

            bdmemberlist = TeamMember.objects.all().order_by('lastname')
            pursuitname = forms.CharField()
            bdmember = forms.ModelChoiceField(queryset= bdmemberlist)
            addbdteam = forms.ModelMultipleChoiceField(
            queryset=TeamMember.objects.all().order_by('lastname'), widget=Select2MultipleWidget,  required=False)



            class Meta:
                model = Project
                fields = ['pursuitname','addbdteam','bdmember',]



        def __init__(self, *args, **kwargs):

            if kwargs.get('instance'):
                initial = kwargs.setdefault('initial', {})
                initial['projects'] = [t.pk for t in
                    kwargs['instance'].project_set.all()]

            forms.ModelForm.__init__(self, *args, **kwargs)

        def save(self, commit=True):
            instance = forms.ModelForm.save(self, False)
            old_save_m2m = self.save_m2m

            def save_m2m():
                old_save_m2m()

                for project in self.cleaned_data['bdmember']:
                    instance.teammember_set.add(project)

提前致谢!!

编辑-在做了更多研究之后,我从脚本中删除了“Through”模型,并试图依靠 form.py 保存方法来进行连接。但是,当我这样做时,两者仍然没有正确连接。

【问题讨论】:

  • 为什么要使用多对多关系?可以为多个团队成员分配一个项目吗?
  • 看看这个在 SQL 级别分解各种关系的出色响应。 stackoverflow.com/a/19644725
  • @Rene 是正确的,多个团队成员将被分配到同一个项目。感谢您的文章-它确实有助于更多地理解关系,但我仍然对如何通过表单提交触发多对多关系感到困惑。谢谢!
  • @Rene - 你是说你认为 manytomany 字段在错误的模型中?因为它应该在 Project 而不是 TeamMember 中?如果是这样的话——如果我有一个名为 Broker 的不同模型,就像 TeamMember,因为它可以分配多个项目,甚至与 TeamMember 相同的项目。所以一个项目可以同时拥有多个经纪人和团队成员?再次感谢...
  • 我需要更多说明。团队成员是否会填写并提交模型表格,然后自动将其分配给他/她?或者您是否希望某个管理员(仅作为示例)在填写表单时分配用户?

标签: python django python-3.x django-models django-forms


【解决方案1】:

由于只有您的管理员(超级用户?)会登录,您可以使用内置的 Django Admin 开始。

我会向您推荐这个,至少现在是这样,因为您是初学者,而且管理表单使用起来非常简单。然后,您可以稍后在您感觉更舒服时创建自定义表单。 :-)

考虑到这一点,您可以尝试消除“通过”表(您可能需要重置迁移),然后尝试这样做。

Admin.py

from django.contrib import admin
from .models import TeamMember, TMAssigned, Project, 

TeamMembersInLine(admin.TabularInline):
    model = TeamMember
    extra = 1

@admin.register(Project):
class ProjectAdmin(admin.ModelAdmin):
    list_display = ('pursuitname', 'bdmember ', 'datecreated')
    inlines = [TeamMembersInLine]

Here's another answer 深入研究直通表。有人在你的情况下问过这个问题,答案也很相关。

【讨论】:

  • 非常感谢,@Rene- 虽然我认为我需要坚持使用自定义表单策略而不是使用管理面板。你知道我可以通过上面的表格来连接这些多对多关系吗?再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-25
  • 2012-08-03
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多