我是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中的用户名来获取具有该特定用户名的用户,并使用该实例化表单。它
在视图本身或表单中,我该怎么做?除非他们是如何处理这个问题的更好方法。
答案 0 :(得分:2)
您可以添加get_initial()
方法来返回相应的dict,如下所示。
class MessageCreateView(CreateView):
...
def get_initial(self):
data = { 'recipient':
User.objects.get(username=self.kwargs.get('recipient'))
}
return data
妥善处理错误。