我有一个活动邀请的模型:
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是针对单个用户的,因此我将遍历选定的用户和组中的成员,并为所有用户创建单独的邀请。你知道我怎样才能生成这个动态表单吗?
发布于 2011-06-12 20:38:31
据我所知,你想要一个登录的用户,在一个事件页面上,点击“邀请他人”按钮,这将向他显示一个表单,他可以在其中选择特定的用户和组,指定一些文本,然后点击“发送”。然后你的应用程序应该创建邀请的多个实例(每个用户一个)并发送它们,跟踪邀请的状态。如果这是正确的,这里是我的建议来实现它:
使用以下模型将使您能够更好地控制您的数据(只保留一次文本,并允许您在所有用户中查找特定邀请):
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})更新:您还可以像这样以一种更加pythonic的方式创建动态表单:
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使用用户参数将...替换为查询集,然后使用get_invite_form(request.user)(request.POST)和get_invite_form(request.user)()代替InviteForm()。
https://stackoverflow.com/questions/6318826
复制相似问题