动态表单生成

2024-06-17 12:40:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个活动邀请模型:

class EventInvitation(models.Model):

    from_user = models.ForeignKey(User, related_name="inviters")
    to_user = models.ForeignKey(User, related_name="invited")
    text = models.CharField(max_length= 150)
    event = models.ForeignKey(Event)
    sent = models.DateTimeField(auto_now=True)
    status = models.IntegerField(choices=INVITATION_STATI, default=0)

我要做的是创建一个动态邀请表单(而不是ModelForm),邀请者根据查询/可以被特定用户邀请的人选择用户,以及基于查询的组选择(邀请者必须是组的所有者)。。。由于EventInvitation是针对单个用户的,因此我将遍历选定的用户和组成员,并为所有用户和成员创建单独的邀请。你知道我怎么生成这个动态的表单吗?在


Tags: 用户namefrom模型表单modelmodels动态
1条回答
网友
1楼 · 发布于 2024-06-17 12:40:41

据我所知,你想要一个登录的用户,在一个事件页面中,点击一个“邀请其他人”按钮,这个按钮会显示一个表单,他可以在其中选择特定的用户和组,指定一些文本,然后单击“发送”。然后你的应用程序应该创建许多邀请实例(每个用户一个)并发送它们,跟踪邀请的状态。如果我的建议是正确的,那么我的建议是:

使用以下模型将使您能够更好地控制数据(只保留文本一次,并允许您查找所有用户的特定邀请):

class EventInvitation(models.Model):
    inviter = models.ForeignKey(User, related_name="inviters")
    event = models.ForeignKey(Event)
    text = models.CharField(max_length= 150)
    created = models.DateTimeField(auto_now=True)

class EventInvitationInvitee(models.Model):
    event_invitation = models.ForeignKey(EventInvitation)
    user = models.ForeignKey(User, related_name="invited")
    status = models.IntegerField(choices=INVITATION_STATI, default=0)

使用如下简单的形式:

^{pr2}$

...替换为用于筛选正确组和用户的代码。在

还有这样一种观点:

def invite(request, event_id):
    event = get_object_or_404(Event, pk=event_id) # you can check if your user is allowed to access this event here
    if request.method == 'POST':
        form = InviteForm(request.user, request.POST)
        if form.is_valid():
            invitation = EventInvitation.objects.create(inviter=request.user, event=event,  text = form.cleaned_data['text'])
            users = set()
            for user in form.cleaned_data['users']:
                users.add(user)
                EventInvitationInvitee.objects.create(event_invitation=invitation, user=user)
            for group in form.cleaned_data['groups']:
                for user in group.user_set.all():
                    if user not in users:
                        users.add(user)
                        EventInvitationInvitee.objects.create(event_invitation=invitation, user=user)
            return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = InviteForm(request.user)

    return render_to_response('invite.html', {'form': form})

更新:您还可以用更像python的方式创建动态表单:

def get_invite_form(user):

  class InviteForm(forms.Form):
      text = forms.CharField(widget=forms.Textarea)
      users = forms.ModelMultipleChoiceField(queryset= ... )
      groups = forms.ModelMultipleChoiceField(queryset= ... )

  return InviteForm

使用user参数将...替换为queryset,然后使用get_invite_form(request.user)(request.POST)和{},而不是{}。在

相关问题 更多 >