20

我正在尝试创建一个对话框,该对话框使用 jquery 的 .load() 函数在呈现的 django 表单中啜饮。.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它不会像我期望的那样抓取任何初始数据。有什么特别的技巧可以让它工作吗?我已经搜索了文档(似乎缺少基于泛型的类视图的示例)和源代码,但我看不出我缺少什么。

4

3 回答 3

28

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
于 2011-06-22T03:37:46.813 回答
1

你可以像这样使用:

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

这对我有用

于 2019-06-28T13:10:48.860 回答
0

(编辑因为你正在尝试的确实有效)

我昨天遇到了同样的问题,但它现在可以工作了——我想我是在返回一个对象而不是 dict in get_initial

在解决您的问题方面,我有点怀疑您似乎在做什么post()- 您可以尝试使用默认值(非覆盖)post()吗?

您还可以使用pdb(或打印语句)检查self.get_form_kwargs确保initial设置的值。

于 2012-04-03T01:47:50.470 回答