2011-06-11 221 views
2

我有一个活动邀请的模型:动态表单生成

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) 

我试图做到的是要有一个动态的邀请函的形式(NOT的ModelForm),其中邀请有选择的用户的基础上,查询/人谁可以通过特定的用户被邀请,并选择群体,也是基于一个查询(邀请人必须是该组的所有者)。既然EventInvitation是为单个用户,我会然后遍历所选的用户和组的成员,并为他们创建个人邀请。任何想法如何我可以生成这种动态的形式?

+1

我不明白你为什么不能使用窗体类的所有邀请。您可以为每个表单实例提供一个不同的用户列表供您选择。 – 2011-06-11 23:43:09

回答

3

据我了解,你要登录的用户,从活动页面,点击一个“邀请其他人”按钮,这表明他的形式,在那里他可以选择特定的用户和组,指定一些文本,然后点击在“发送”上。然后,您的应用程序应创建许多邀请实例(每个用户一个)并发送它们,以跟踪邀请的状态。如果这是正确的,我的建议如下:

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

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) 

使用一个简单的形式是这样的:

from django.contrib.auth.models import User, Group 

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

    def __init__(self, user, *args, **kwargs): 
     super(InviteForm, self).__init__(*args, **kwargs) 
     self.fields['users'].queryset = User.objects.filter(...) 
     self.fields['groups'].queryset = User.objects.filter(...) 

替换...与您的代码来过滤正确的组和用户。

而在这个时尚观点:

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}) 

更新

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 

使用与查询集替换...:您也可以在这样一个更Python的方式创建一个动态的形式用户参数,以后使用get_invite_form(request.user)(request.POST)get_invite_form(request.user)()而不是InviteForm()

+0

非常感谢。我设法想出了一些解决方案,但是你的解决方案简单得多,所以我会改变它。而且,把模型分成两个表格应该让所有被邀请的用户查询并且简单些。 – freethrow 2011-06-12 23:07:08