2011-04-14 28 views
13

我想创建一个对话框,它使用jquery的.load()函数在呈现的django表单中啜泣。 .load函数被传递给“alert”对象的pk。另外,在类函数可用的东西像self.request.user所以我可以预先填补这些领域,在信息模型(models.py)如下图所示:如何将django的泛型CreateView与初始数据进行分类?

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中呈现时,它并不像我所期望的那样获取任何初始数据。有没有特别的窍门让这个工作?我搜索了文档(似乎缺乏基于泛型的类视图的示例)和源代码,但我看不到我缺少的东西。

回答

19

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

请原谅我的无知,但不复制字典的风险是什么? – Harry 2014-01-13 14:58:59

+0

@HarryGordon尝试: dict1 = { 'A':1, 'B':2} dict2 = dict1 dict2 [ 'B'] = 10 打印(dict1) – 2014-02-06 13:32:12

+0

看起来像所有的换行丢失:( – 2014-02-06 13:34:24

0

(编辑,因为你想什么实际的工作)

我昨天碰到了同样的问题,但它的工作现在–我想我是在get_initial中返回一个对象而不是字典。

在修理你的问题而言,我有点怀疑你有多少似乎post() –可以使用默认的(非overrided)post()尝试在做?

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