使用CBV中的初始值实例化ModelForm

时间:2014-06-14 17:28:30

标签: django django-class-based-views

我是Django新手,使用Django CBV并且很难为我的ModelForm设置初始值。为了概述,我试图通过创建一个简单的消息传递应用程序来学习。

这是我的代码:

models.py

import datetime
from django.contrib.auth.models import User
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.utils import timezone

class Message(models.Model):
    subject = models.CharField(_("Subject"), max_length=100)
    body = models.TextField(_("Body"))
    sender = models.ForeignKey(User, db_index=True, related_name='sent_messages')
    recipient = models.ForeignKey(User, db_index=True, related_name='received_messages')
    parent_msg = models.ForeignKey('self', related_name='next_messages', null=True, blank=True)

forms.py

from django.forms import ModelForm
from .models import Message

class MessageForm(ModelForm):    
    class Meta:
        model = Message
        exclude = ('sender', 'recipient', 'parent_msg',)

views.py

class MessageCreateView(CreateView):
    form_class = MessageForm
    model = Message
    template_name = 'messages/compose.html'

    def form_valid(self, form):
        form.instance.sender = self.request.user
        return super(MessageCreateView, self).form_valid(form)

urls.py

...
url(r'^compose/(?P<recipient>[\w.@+-]+)/$', MessageCreateView.as_view(), name='messages_compose_to'),
...

从urls.py文件中可以看到,我正在使用&#39;收件人&#39;参数如下:http://localhost:8000/members/compose/someusername

现在我的问题是我希望打开撰写邮件视图,并通过从URL获取用户名来初始化收件人字段,然后使用URL中的用户名来获取具有该特定用户名的用户,并使用该实例化表单。它

在视图本身或表单中,我该怎么做?除非他们是如何处理这个问题的更好方法。

1 个答案:

答案 0 :(得分:2)

您可以添加get_initial()方法来返回相应的dict,如下所示。

class MessageCreateView(CreateView):
    ...
    def get_initial(self):
        data = { 'recipient': 
                    User.objects.get(username=self.kwargs.get('recipient'))
               }
        return data

妥善处理错误。