2012-05-18 51 views
1

我目前在views.py的設置是這樣如何在Django中外部設置ModelForm中的字段?

def order_detail(request, pk): 
    order = Order.objects.get(pk=pk) 

    # Define the can_something variables here. 

    include_fields = [] 

    if can_edit_work_type: 
     include_fields.append('work_type') 
    if can_edit_vendor: 
     include_fields.append('vendor') 
    if can_edit_note: 
     include_fields.append('note') 

    class OrderDetailForm(forms.ModelForm): 
     class Meta: 
      model = Order 
      fields = tuple(include_fields) 

    form = OrderDetailForm(instance=order, data=request.POST) 

    return render(request, 'doors/order/detail.html', {'order': order, 'form': form})  

很明顯,我認爲這是界定OrderDetailFormforms.py,而不是views.py最佳實踐。那麼如何將OrderDetailForm移動到forms.py並仍然通過include_fields

我想是這樣的,但它沒有工作

views.py

def order_detail(request, pk): 
    order = Order.objects.get(pk=pk) 

    # Define the can_something variables here. 

    include_fields = [] 

    if can_edit_work_type: 
     include_fields.append('work_type') 
    if can_edit_vendor: 
     include_fields.append('vendor') 
    if can_edit_note: 
     include_fields.append('note') 

    form = OrderDetailForm(instance=order, data=request.POST, include_fields=include_fields) 

    return render(request, 'doors/order/detail.html', {'order': order, 'form': form})  

forms.py

class OrderDetailForm(forms.ModelForm): 
    class Meta: 
     model = Order 

    def __init__(self, include_fields, *args, **kwargs): 
     super(OrderDetailForm, self).__init__(*args, **kwargs) 

     self.Meta.fields = tuple(include_fields) 

但沒有工作;它包括模型上的所有字段。我假設問題是在面向對象方面。

歡迎任何提示或建議。提前致謝!

回答

1

您必須在初始化程序中修改self.fields,刪除序列中找不到的映射中的鍵。

+0

對不起,我不明白。你能告訴我一個例子嗎? – hobbes3

+0

迭代'self.fields'。刪除不在序列中的鍵。 –

+0

那麼'self.fields'是字典的列表?我不明白我是否想要做一些像'self.fields =('one','two')'或者我必須明確地設置類似'self.fields ['one'] = SomeFieldInput() '(但是如果我必須明確陳述現場輸入,那麼擁有'ModelForm'有什麼意義)。如果我做'class Meta:fields =()',那麼這意味着'self.fields'最初是空的? – hobbes3

1

看着Django代碼,你可能想嘗試使用self._meta.fields = tuple(include_fields)

+0

它不起作用,允許'Order'模型中的所有字段。 – hobbes3

+0

嘗試將'Meta'-munging移動到'super()'調用的上方。 –

+0

像換行'self._meta.fields = tuple(include_fields)'和'super(OrderDetailForm,self).__ init __(* args,** kwargs)''這仍然沒有奏效。它仍然顯示每一個領域。 – hobbes3

相關問題