如何使用初始数据子类化django的通用CreateView?

时间:2011-04-14 16:34:58

标签: django-forms django-views django-class-based-views

我正在尝试创建一个对话框,该对话框使用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中呈现时,它不会抓取任何表单像我期望的那样的初始数据。是否有一个特殊的技巧让这个工作?我已经搜索了文档(似乎缺乏基于泛型的类视图的示例)和源代码,但我看不到我缺少的内容。

3 个答案:

答案 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())

对我有用