2013-07-06 31 views
0

我正在嘗試創建一個簡單的收件箱應用程序,允許用戶使用UserModel發送每個其他消息。Django如何在formset隱藏字段中初始化queryset中所有對象的對象ID?

如何在formset的隱藏字段中的查詢集中填充所有對象的id?因爲當我嘗試

File "C:\mysite\pet\views.py" in message 
913.  initial.update({'hidden_field': messages.id}) 

異常類型:AttributeError的在/消息/ 異常值: '功能' 對象沒有屬性 'ID'

class Message(models.Model): 
    user = models.ForeignKey(User, related_name='sender') 
    recipient = models.ForeignKey(User, related_name='recipient') 
    created = models.DateTimeField(auto_now_add=True) 
    body = models.CharField(max_length=1000) 
    read = models.BooleanField(default=False) 
    trash = models.BooleanField(default=False) 
    sentmessage = models.BooleanField(default=False) 
    thread = models.ForeignKey(Thread,blank=True,null=True) 
    draft = models.BooleanField(default=False) 


    def __unicode__(self): 
     return self.body 

視圖

@login_required 
def message(request):  
    person = Person.objects.get(user=request.user) 
    messages = Message.objects.filter(recipient=request.user.id).order_by("-created").values  
    initial = {} 
    initial.update({'hidden_field': messages.id}) 

    form = formset_factory(CheckBoxForm) 
    formset = form(initial=initial) 
    return render(request,'messages.html',{'messages':messages,'form':form,'person':person}) 

形式

class CheckBoxForm(forms.Form): 
    checkbox = forms.BooleanField(required=False) 
    hidden_field = forms.CharField(widget=forms.HiddenInput())  

模板

 {% for m in messages %} 
    {{m.body}} 
    {% endfor %} 

@新代碼

@login_required 
def message(request):  
    messages = Message.objects.filter(recipient=request.user).order_by("-created") 

    form = CheckBoxForm() 
    if request.method =='POST': 
     form = ReplyForm(request.POST) 
     if form.is_valid(): 
      id = request.POST.get('hidden_field', False) 
      Message.objects.filter(pk=id).delete() 
    return render(request,'messages.html',  {'messages':messages,'form':form,'person':person}) 
+2

您只能訪問模型類實例中的標識。我假設你將複選框放在消息旁邊,儘管它不在你的代碼中。如果是這種情況,爲什麼不把模板中的? – JonLeslieHarding

+0

@lntheNoob我發佈了上面的一些新代碼,我做到了。例如,如果我有5複選框。並嘗試通過發佈刪除它。它只會刪除一個 – JackRoster

+0

@IntheNoob,如果他們的許多消息,然後他們的許多複選框。你將如何創建一個可以刪除對象的函數? – JackRoster

回答

1

說實話,我會用JavaScript做到這一點。也許這不被認爲是最好的方式,或者實際上是最好的方式,但是它是一種方式。

模板:

<head> 
<script> 
checkbox=getelementbyId('#container'); 
var itemlist= []; 
function togglelist(newitem){ 
    field=getelementbyId('#'+newitem); 
if (!field.value){ 
     itemlist.push(newitem) 
} 
else{ 
    itemlist.remove(itemlist.indexOf(newitem)) 
}; 
checkbox.innerHTML="<input type='hidden' id='checkbox' label='hidden_field' value='"+String(itemlist)+"'>"; 

} 
</script> 
</head> 
<body> 
<div id="container"> </div> 
{% for m in messages %} 
<input type="checkbox" id="{{m.id}}" onchange="togglelist({{m.id}})"> 
{{m.body}} 
{% endfor %} 

你的models.py你可以擺脫布爾值的,只是有一個字符字段,hidden_​​field。 然後在你的views.py剛剛從分析字符串列表,使用AST庫:

import ast 
form = CheckBoxForm() 
if request.method =='POST' and form.is_valid(): 
     deletelist = request.POST.get('hidden_field', False) 
     ids=ast.literal_eval(deletelist) 
     for id in ids: 
      Message.objects.filter(pk=id).delete() 

對不起,我無法對此進行測試,但我希望這是有幫助的。

+0

謝謝你的幫助,我得到這個錯誤'int'對象不是iterable指向id在ids:。我該怎麼辦? – JackRoster

+0

當你打印出變量ids時,它顯示了什麼?應該是一個列表而不是一個int,如果這個代碼的話。 Deletelist應該是一個看起來像列表的字符串,它們在JS和Python中被標記爲相同的,因此它應該可以工作 – JonLeslieHarding

+0

您是否將我的代碼放入模板中?我懷疑不是。 javascript用python可以解釋的字符串形式創建一個id列表。 – JonLeslieHarding