2012-04-08 47 views
1

我有一个模型表单有四个字段:消息,作者,房间和时间戳。时间戳设置为auto_now,因此不会出现在表单中。作者和房间都是ForeignKey,我希望他们自动填写表单,作者被设置为request.user,并通过url传递给查看的房间:/ add_message/{{room.id}} /'The只有客户填写的字段才是消息。这里的观点,到目前为止,但我不知道如何实现这一点:如何自动填写表单域在Django

@login_required(login_url="/login/") 
def add_message(request, room_id): 
    p = get_object_or_404(Room, pk=room_id) 
    m = Message.objects.all().order_by('-timestamp') 
    form = MessageForm(request.POST or None) 
    if form.is_valid(): 
     cmodel = form.save() 
     cmodel.save() 
    return HttpResponseRedirect(reverse('chat.views.add_message', args=(p.id,))) 

return render_to_response('chatroom.html', {'contact_form': form, 'room':p, 'latest_message_list': m}, context_instance=RequestContext(request)) 
+0

在窗体中还是按视图? – 2012-04-08 15:43:44

+0

我希望消息可以由客户在表单中输入,并在视图中定义的用户和房间一起发布。分别为request.user和room.id。 – 2012-04-08 15:52:56

回答

1

没有测试,但应该工作

forms.py

class MessageForm(forms.ModelForm): 
    def __init__(self, **kwargs): 
     self.room = kwargs.pop('room', None) 
     self.author = kwargs.pop('author', None) 
     super(MessageForm, self).__init__(**kwargs) 

    def save(self, commit=True): 
     obj = super(MessageForm, self).save(commit=False) 
     obj.room = self.room 
     obj.author = self.author 
     if commit: 
      obj.save() 
     return obj 

    class Meta: 
     model = Message 

views.py

@login_required(login_url="/login/") 
def add_message(request, room_id): 
    room = get_object_or_404(Room, pk=room_id) 
    form = MessageForm(room=room, author=request.user, data=request.POST) 
    if form.is_valid(): 
     form.save() 
    return HttpResponseRedirect(reverse('chat.views.add_message', args=(p.id,))) 
+0

它看起来好像是会做这项工作,但是,我刚刚测试了它,并提出了一个NameError声明:name'forms'未定义,然后我将forms.ModelForm更改为ModelForm,然后它抱怨:ModelForm具有没有指定模型类别。否则,一旦清理出来,看起来像我之后。 – 2012-04-08 16:17:06

+0

'从django进口表格' – San4ez 2012-04-08 16:19:14

+0

试过了,依然不起作用。 – 2012-04-08 16:22:23