我正在尝试创建一个对话框,该对话框使用jquery的.load()函数以渲染的django形式进行slurp。 .load函数传递给“alert”对象的pk。类函数中也可以使用self.request.user
之类的东西,所以我可以预先填充这些字段,如下面的消息模型(models.py)所示:
class Message(models.Model):
user = models.ForeignKey(User)
alert = models.ForeignKey(Alert)
date = models.DateTimeField()
message = models.TextField()
子类化django的CreateView使得使用ModelForm(views.py)的实例生成上下文非常容易:
class MessageDialogView(CreateView):
""" show html form fragment """
model = Message
template_name = "message.html"
def get_initial(self):
super(MessageDialogView, self).get_initial()
alert = Alert.objects.get(pk=self.request.POST.get("alert_id"))
user = self.request.user
self.initial = {"alert":alert.id, "user":user.id, "message":"test"}
return self.initial
def post(self, request, *args, **kwargs):
super(MessageDialogView, self).post(request, *args, **kwargs)
form_class = self.get_form_class()
form = self.get_form(form_class)
context = self.get_context_data(form=form)
return self.render_to_response(context)
这里的问题是self.initial
没有使用表单呈现。我已经确保表单确实在调用get_initial
并且表单实例在post
中有正确的初始数据,但是当表单在模板message.html
中呈现时,它不会抓取任何表单像我期望的那样的初始数据。是否有一个特殊的技巧让这个工作?我已经搜索了文档(似乎缺乏基于泛型的类视图的示例)和源代码,但我看不到我缺少的内容。
答案 0 :(得分:24)
get_initial()
应该只返回字典,而不是设置self.initial
。
您的方法应如下所示:
def get_initial(self):
# Get the initial dictionary from the superclass method
initial = super(YourView, self).get_initial()
# Copy the dictionary so we don't accidentally change a mutable dict
initial = initial.copy()
initial['user'] = self.request.user.pk
# etc...
return initial
答案 1 :(得分:0)
(编辑因为您尝试的确实有效)
我昨天遇到了同样的问题,但它现在正在运行 - 我想我在get_initial
中返回了一个对象而不是一个字典。
在解决您的问题方面,我对您在post()
中的表现有点怀疑 - 您是否可以使用默认(非覆盖)post()
进行尝试?< / p>
您还可以使用pdb
(或打印语句)检查self.get_form_kwargs
的值,确保initial
已设置。
答案 2 :(得分:0)
您可以像这样使用:
from django.shortcuts import HttpResponseRedirect
class PostCreateView(CreateView):
model = Post
fields = ('title', 'slug', 'content', 'category', 'image')
template_name = "create.html"
success_url = '/'
def form_valid(self, form):
self.object = form.save(commit=False)
self.object.user = self.request.user
self.object.save()
return HttpResponseRedirect(self.get_success_url())
对我有用