2013-03-24 50 views
1

如何創建一個django表單來顯示用戶的銷售對象,每個對象旁邊都有一個收音機框供刪除? 我正在嘗試創建類似於django admin的用戶列表,其中包含用於快速刪除的單選框。如何使用用戶數據呈現表單?

django forms

從request.user我試圖從用戶獲得銷售的關聯對象,並返回一個列表 ,以刪除選定的銷售。到目前爲止,我的個人資料形式如下:

class ProfileForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop("request") 
     super(ProfileForm, self).__init__(*args, **kwargs) 

    sells = forms.IntegerField(
     widget=forms.Select(
      sell=Sell.object.filter(user=self.request.uwer) 
     ) 
    ) 

在views.py我打算刪除像這樣選擇拋售對象:

for sell in form.sells: 
    sell = Sell.objects.get(id=sell) 
    sell.delete() 

回答

1

有什麼錯在這裏的不少東西。最重要的是,您無法在表單定義中設置選項,因爲您無法在那裏訪問request.user

無論如何,我不認爲你想要一個模型表單。這些用於創建和編輯模型實例,而您只需要使用複選框列出現有實例。所以你只需要一個帶有表示這些實例的字段的正常形式,即ModelMultipleChoiceField。

所以,形式如下:

class DeleteSellForm(forms.Form): 
    sells = forms.ModelMultipleChoiceField(queryset=Sell.objects.none(), 
              widget=forms.CheckboxSelectMultiple) 

    def __init__(self, *args, **kwargs): 
     user = kwargs.pop('user', None) 
     super(DeleteSellForm, self).__init__(*args, **kwargs) 
     self.fields['sells'].queryset=Sell.objects.filter(user=user) 

你會發現查詢集默認爲無,但被設置爲正確的用戶對象在__init__方法,在這裏我們可以在用戶通過。

所以認爲是這樣的:

def delete_sells(request): 
    if request.POST: 
     form = DeleteSellsForm(request.POST, user=request.user) 
     if form.is_valid(): 
      form.cleaned_data['sells'].delete() 
    else: 
     form = DeleteSellsForm(user=request.user) 
    return render(request, 'template.html', {'form': form}) 

ModelMultipleChoiceField清潔處理,以一個QuerySet,所以你應該能夠直接調用delete()就可以了。

+0

Woops,我其實打算使用form.Form。 Model.forms需要'class Meta:...'。謝謝!這工作! – davierc 2013-03-25 19:03:14

+0

還有一個問題,爲什麼我們需要彈出用戶?如'user = kwargs.pop('user',None)' – davierc 2013-03-25 19:04:49

相關問題