Django Initial for a ManyToMany Field
我有一个编辑模型实例的表单。我想使用表单将所有隐藏的值传递给登录用户,初始值为
我的视野
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @login_required def event_view(request,eventID): user = UserProfile.objects.get(pk=request.session['_auth_user_id']) event = events.objects.get(eventID = eventID) if request.method == 'POST': form = eventsSusbcribeForm( request.POST,instance=event) if form.is_valid(): form.save() return HttpResponseRedirect('/events/') else: form = eventsSusbcribeForm(instance=event) return render_to_response('event_view.html', {'user':user,'event':event, 'form':form},context_instance = RequestContext( request )) |
我的表格
1 2 3 4 5 6 7 8 9 10 11 12 13 | class eventsSusbcribeForm(forms.ModelForm): eventposter = forms.ModelChoiceField(queryset=UserProfile.objects.all(), widget=forms.HiddenInput()) details = forms.CharField(widget=forms.Textarea(attrs={'cols':'50', 'rows':'5'}),label='Enter Event Description here') date = forms.DateField(widget=SelectDateWidget()) class Meta: model = events exclude = ('deleted') def __init__(self, *args, **kwargs): super(eventsSusbcribeForm, self).__init__(*args, **kwargs) self.fields['username'].initial = (user.id for user in UserProfile.objects.filter()) |
我的模型
1 2 3 4 5 6 7 8 9 10 11 12 | class events(models.Model): eventName = models.CharField(max_length=100) eventID = models.AutoField(primary_key=True) details = models.TextField() attendanceFee = models.FloatField(max_length=99) date = models.DateField() username = models.ManyToManyField(UserProfile, related_name='user', blank=True) eventposter = models.ForeignKey(UserProfile, related_name='event_poster') deleted = models.BooleanField() def __unicode__(self): return u'%s' % (self.eventName) |
你能发布你的活动模型吗?如果没有这个,你想做什么太难了。我必须假设一些事情没有它,所以如果我错了我很抱歉。
首先,我猜您不应该使用事件订阅窗体的事件模型窗体。这真的没有道理。希望您为事件和用户创建了一个贯穿类,所以在您的事件模型中,您有
1 | subscriber_users = models.ManyToManyField(User, through="Subscription") |
和
1 2 3 | class Subscription(models.Model): user = models.ForeignKey(User, related_name="events",) event = models.ForeignKey(Event, related_name="subscribers") |
然后可以使用订阅模型窗体。
您使用event id而不是django习语event_id有什么原因吗?您还应该导入带有pythonic大小写的事件和事件subcribeform类。一件非常重要的事情是,您应该将所有内容链接到用户,而不是用户配置文件。
从技术上讲,在视图中设置初始值比设置表单in it更有意义,因为无论如何都必须将request.user传递给in it。
我觉得你应该试试这个…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @login_required def event_view(request, event_id=None): user = request.user.get_profile() event = Event.objects.get(id=event_id) initial = {'user': request.user} form = EventSubcriptionForm(request.POST or None, instance=event, initial=initial) if form.is_valid(): form.save() return HttpResponseRedirect(reverse('event_list')) return render_to_response('event_view.html', { 'event': event, 'form': form }, context_instance = RequestContext(request)) |
几点注意事项
- 为当前用户的配置文件对象使用request.user.get_profile()。
- 您可以使用
request.POST or None 来避免request.method案例 - 始终使用命名的URL,这样您就可以在名称上反转,而不是在视图中硬编码URL。
- 如果您想在模板上下文中使用
user ,只需设置一个上下文处理器(例如,请参阅pinax了解如何执行此操作),而不必在每个视图中传递它。您也可以始终使用request.user。
请记住,只有通过类设置(如我所说)并使用
1 2 3 4 | class EventSubcriptionForm(forms.ModelForm): class Meta: model = Subscription exclude = ('event') |
编辑多谢你们的帮助。我对姜戈并不陌生,但不知何故我对姜戈很陌生。
好吧,你真的应该读一些关于python约定的PEP http://www.python.org/dev/peps/pep-0008/或者一些关于它的文章,关于变量和函数名,python中的命名约定是什么?.
以下是我对您的活动应用程序models.py的建议:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Event(models.Model): name = models.CharField(max_length=100) details = models.TextField() attendance_fee = models.FloatField(max_length=99) date = models.DateField() poster = models.ForeignKey(User, related_name='events_posted') deleted = models.BooleanField() attendee_users = models.ManyToManyField(User, through="Attendance") def __unicode__(self): return self.name class Attendance(models.Model): user = models.ForeignKey(User, related_name="events",) event = models.ForeignKey(Event, related_name="attendees") |
笔记
- 类的名称是大写和单数。你不是在描述事件,你是事件的蓝图。
- 在属性中不需要类的名称,即事件名称可以是名称。
- 所有变量都是小写和下划线
- 始终链接到用户,而不是您的配置文件模型。很多Django代码都期望这样。
现在,您可以使用event.attentials访问参加活动的用户。
我是在为许多人设置默认值时发现的。我不想添加直通表。
基于凯西发布的视图,但在manytomany关系中添加了用户。
对于初始职位:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @login_required def event_view(request, event_id=None): user = request.user.get_profile() event = Event.objects.get(id=event_id) initial = {'user': request.user, 'username': [ request.user.id, ] } # makes the poster also an attendee form = EventSubcriptionForm(request.POST or None, instance=event, initial=initial) if form.is_valid(): form.save() return HttpResponseRedirect(reverse('event_list')) return render_to_response('event_view.html', { 'event': event, 'form': form }, context_instance = RequestContext(request)) |
更新版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @login_required def event_view(request, event_id=None): user = request.user.get_profile() event = Event.objects.get(id=event_id) initial = {'user': request.user, 'subscriber_users': [ request.user.id, ] } # makes the poster also an subscriber form = EventSubcriptionForm(request.POST or None, instance=event, initial=initial) if form.is_valid(): form.save() return HttpResponseRedirect(reverse('event_list')) return render_to_response('event_view.html', { 'event': event, 'form': form }, context_instance = RequestContext(request)) |