2012-07-15 47 views
1

我正在設置一個設置界面,它通過掃描已安裝應用程序中的設置文件夾,掃描設置文件並最終掃描ModelForms來工作。django:使用查詢集作爲modelform初始數據

我現在正在最後一步。表格被正確找到並加載,但我現在需要提供初始數據。初始數據將從數據庫中提取,並且,如您所想,它必須僅限於經過身份驗證的用戶(通過request.user.id)。

請記住,這一切都是動態完成的。沒有任何名稱,也沒有他們的結構是先進的(我真的不想維護一個無聊的設置界面)。

下面是一個示例設置窗體。我只是選擇模型和用戶可以編輯的字段(這是我想要維護設置界面的程度)。

class Set_Personal_Info(forms.ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('nick_name', 'url') 

我已經看了其中modelformset_factory幾乎做什麼,我想做的事情,但似乎只與兩個或多個結果工作。 (在這裏,OBJ是的設置形式之一)

Formset = modelformset_factory(obj.Meta.model, form=obj) 
Formset(queryset=obj.Meta.model.objects.filter(id=request.user.id)) 

我不能過濾數據,我得一個,只有一個結果。不幸的是,我不能使用get()

Formset = modelformset_factory(obj.Meta.model, form=obj) 
Formset(queryset=obj.Meta.model.objects.get(id=request.user.id)) 

「用戶」對象有沒有屬性「有序」

提供查詢結果作爲初始數據也不起作用,因爲它不是一個名單。

Formset = modelformset_factory(obj.Meta.model, form=obj) 
Formset(initial=obj.Meta.model.objects.get(id=request.user.id)) 

「用戶」對象不支持索引

我有一種感覺,答案就在我的面前。我如何從數據庫中提取數據庫並將其作爲初始值推送到表單中?

回答

2

我不確定我是否理解你要做的事 - 如果你只是對單一表單感興趣,我不知道你爲什麼參與表單集。

若要用數據庫初始數據的ModelForm,你只是通過實例論證:

my_form = Set_Personal_Info(instance=UserProfile.objects.get(id=request.user.id)) 

不要忘了也傳遞,當你在實例POST形式實例參數,所以Django更新現有的實例,而不是創建一個新的實例。

(請注意,你可能要考慮到你的對象給予更好的名字。obj通常描述模型實例,而不是一個形式,這form將是一個更好的名字。和Form類應遵循PEP8,並可能包括單詞「形式」 - 所以PersonalInfoForm將是一個好名字。)

0

根據我所瞭解的...如果你想生成動態字段的表格,你可以使用這個:

類MyModelForm(forms.ModelForm):

def __init__(self, dynamic_fields, *args, **kwargs): 
    super(MyModelForm, self).__init__(*args, **kwargs) 

    self.fields = fields_for_model(self._meta.model, dynamic_fields, self._meta.exclude, self._meta.widgets) 

    class Meta: 
     model = MyModel 

凡dynamic_fields是一個元組。

更多關於動態表單:

  1. http://www.rossp.org/blog/2008/dec/15/modelforms/
  2. http://jacobian.org/writing/dynamic-form-generation/
  3. http://dougalmatthews.com/articles/2009/dec/16/nicer-dynamic-forms-django/

而且丹尼爾的方法是有效的,乾淨......根據你不同的ID /類型等,你可以你使用不同的Form對象

的forms.py

類MyModelFormA(forms.ModelForm):

class Meta: 
    model = MyModel 
    fields = ('field_a','field_b','field_c') 
    class MyModelFormB(forms.ModelForm): 

class Meta: 
    model = MyModel 
    fields = ('field_d','field_e','field_f') 

views.py

如果request.method == 'POST':

if id == 1: 
    form = MyModelFormA(data=request.POST) 
elif id == 2: 
    form = MyModelFormB(data=request.POST) 
else: 
    form = MyModelFormN(data=request.POST) 

if form.is_valid(): 
    form.save() else: 
if id == 1: 
    form = MyModelFormA() 
elif id == 2: 
    form = MyModelFormB() 
else: 
    form = MyModelFormN() 
相關問題