【问题标题】:Django inlineformset_factoryDjango inlineformset_factory
【发布时间】:2013-12-23 11:23:40
【问题描述】:

我遇到了 Django 框架的问题。具体来说,用户可以创建一个组并将成员 (>=1 &&

archi_groupmember.group_id 不能为 NULL

我更改了 MemberGroup 表单的小部件,因为用户不必从选择中选择成员,但他必须键入成员的邮件。 所以我认为我应该在保存 MemberGroup 之前坚持成员,但我不知道该怎么做!

我对 Django 完全陌生,我正在关注文档。

谢谢大家的帮助!!

这里只是为了澄清一个页面截图:http://postimg.org/image/bndh5ug29/

按照我的代码。

模型.py:

class Group(models.Model):
    user = models.ForeignKey(User)
    limit = Q(active = True)
    project = models.ForeignKey(Project, limit_choices_to = limit)
    name = models.CharField(max_length=100)
    code = models.CharField(max_length=100, unique=True)

    def __unicode__(self):
        return self.name


class Member(models.Model):
    groups = models.ManyToManyField(Group, through='GroupMember')
    email = models.EmailField(max_length=254, unique=True)

    def __unicode__(self):
        return self.email


class GroupMember(models.Model):
    group = models.ForeignKey(Group)
    member = models.ForeignKey(Member)
    name = models.CharField(max_length=100)
    surname = models.CharField(max_length=100)

views.py:

@login_required
@user_passes_test(first_login_check, login_url='/detail')
def partecipate(request):
    from django.forms import TextInput

    MemberFormSet = inlineformset_factory(Group, Member.groups.through, form=GroupMemberForm, can_delete=False, extra=3, widgets={'member': TextInput() } )
    if request.method == 'POST':

        form = GroupForm(request.POST)
        member_set = MemberFormSet(request.POST)

        if form.is_valid():

        for form in member_set: 
                print vars( form['member'] )

            group = form.save(commit=False)
            group.user = request.user
            group.code = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(10))
            group.save()

            member_set = MemberFormSet(request.POST, instance=group)
            member_set = member_set.save(commit=False)


            payment = Payment()
            payment.group = group
            payment.invoice = _createInvoice(group.project.id, group.id)
            payment.save()
            return HttpResponseRedirect("/")
        else:
            return render(request, "partecipate.html", { 'form': form, 'member_set' : member_set })
    else:
        form = GroupForm()
        form.Meta.model.project.queryset = Project.objects.filter(active=True)
        member_set = MemberFormSet(initial=[ {'name': request.user.first_name,'surname': request.user.last_name,'member':request.user.email} ])

    return render(request, "partecipate.html", { 'form': form, 'member_set' : member_set })

【问题讨论】:

    标签: django python-2.7 many-to-many inline-formset formset


    【解决方案1】:

    您使用的是哪个版本的 Django?

    从 1.3 开始,帮助文档中有一个使用 inlineformset_factory 的示例。并且示例(下面的链接)清楚地显示了传递 parent 记录的实例。没有它,您的表单集将不会链接到真实数据。

    https://docs.djangoproject.com/en/1.7/topics/forms/modelforms/#using-an-inline-formset-in-a-view

    我也怀疑将 Member.groups.through 表类指定为子表类。我认为您应该将其保留为 Member,因为直通表是内部机制的一部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-01
      • 2018-05-08
      • 1970-01-01
      • 2011-01-10
      • 2021-06-19
      • 2016-09-15
      • 2011-02-04
      相关资源
      最近更新 更多