簡體   English   中英

Django inlineformset_factory

[英]Django inlineformset_factory

我陷入Django框架問題。 詳細地,用戶可以創建一個組,並將Member(> = 1 && <= 3)關聯到該組。 每個成員均通過電子郵件地址標識(唯一)。 但是,同一成員可以在不同的組中以不同的姓名參加。 因此,我在組和成員之間有很多對多關系(通過使用)。 在我看來,我有一個inlineformset。 但是,當我提交表格時,我總是得到:

archi_groupmember.group_id不能為NULL

我已更改了MemberGroup表單的小部件,因為用戶不必從選擇中選擇成員,但他必須鍵入成員的郵件。 因此,我認為我應該在保存MemberGroup之前保留該成員,但是我不知道該怎么做!

我是Django的新手,正在關注文檔。

謝謝大家的幫助!

這里的頁面截圖只是為了澄清: http : //postimg.org/image/bndh5ug29/

按照我的代碼。

Models.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?

從1.3開始,幫助文檔提供了一個使用inlineformset_factory的示例。 該示例(下面的鏈接)清楚地顯示了傳入記錄的實例。 否則,您的表單集將不會鏈接到真實數據。

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

我還懷疑將Member.groups.through表類指定為子類。 我認為您應該將其保留為Member ,因為穿透表是內部機制的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM