2011-04-14 41 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正在設置。

相關問題