2012-08-15 85 views
-1

正在努力研究如何在我的Django表單中重寫__init__()方法以包含來自數據庫的其他值。我有一組攝影師,我試圖將其列爲用戶的表單選項。之後,用戶的攝影師選擇將被添加(連同其他信息)到數據庫中作爲新模型的實例化。Over-Ride __init__:擴展表單(Python/Django)

這是我的其他Current Question的延續或詳細說明。 @Rob Osborne給了我一些很好的建議,幫助我理解如何擴展BaseForm,但我仍然無法讓我的代碼執行。如果您有興趣,鏈接的問題會列出我的模型,表單和視圖。雖然我明白使用ModelForm更容易,更有文檔記錄,但我必須在此實例中使用BaseForm。

以下是我有:

class AForm(BaseForm): 
    def __init__(self, data=None, files=None, instance=None, auto_id='id_%s', 
       prefix=None, initial=None, error_class=ErrorList, 
       label_suffix=':', empty_permitted=False): 

     self.instance = instance 
     object_data = self.instance.fields_dict() 
     self.declared_fields = SortedDict() 
     self.base_fields = fields_for_a(self.instance) 

     BaseForm.__init__(self, data, files, auto_id, prefix, object_data, 
         error_class, label_suffix, empty_permitted) 
     self.fields['photographer'].queryset = Photographer.objects.all() 

    def save(self, commit=True): 
     if not commit: 
      raise NotImplementedError("AForm.save must commit it's changes.") 

     if self.errors: 
      raise ValueError(_(u"The Form could not be updated because the data didn't validate.")) 

     cleaned_data = self.cleaned_data 

     # save fieldvalues for self.instance 
     fields = field_list(self.instance) 

     for field in fields: 
      if field.enable_wysiwyg: 
       value = unicode(strip(cleaned_data[field.name])) 
      else: 
       value = unicode(cleaned_data[field.name]) 

KeyError at 'photographer'使用上面的代碼的結果。

我很感激任何關於如何解決這個KeyError的想法/意見,以便我可以將photographer值寫入到我的表單中。謝謝!


編輯:

試圖使用超的建議,@supervacuo,但仍得到一個KeyError at photographer像以前一樣:

class AForm(BaseForm): 
    def __init__(self, data=None, files=None, instance=None, auto_id='id_%s', 
      prefix=None, initial=None, error_class=ErrorList, 
      label_suffix=':', empty_permitted=False): 

     super(AForm, self).__init__(data, files, auto_id, prefix, object_data,       error_class, label_suffix, empty_permitted) 
     self.fields['photographer'].queryset = Photographer.objects.all() 

什麼可能我會丟失所產生KeyError異常?感謝您的任何建議。


編輯2:從models.py添加fields_dict()

class A(models.Model): 
    category = models.ForeignKey(Category) 
    user = models.ForeignKey(User) 

    def fields_dict(self): 
     fields_dict = {} 
     fields_dict['title'] = self.title 

     for key, value in self.fields(): 
      fields_dict[key.name] = value.value 

     return fields_dict 

感謝您的任何意見。


EDIT 3:(在上面的初始問題編輯class AForm爲好,以包括更多的信息)

def fields_for_a(instance): 
    fields_dict = SortedDict() 
    fields = field_list(instance) 

    for field in fields: 
     if field.field_type == Field.BOOLEAN_FIELD: 
      fields_dict[field.name] = forms.BooleanField(label=field.label, required=False, help_text=field.help_text) 
     elif field.field_type == Field.CHAR_FIELD: 
      widget = forms.TextInput 
      fields_dict[field.name] = forms.CharField(label=field.label, required=field.required, max_length=field.max_length, help_text=field.help_text, widget=widget) 

      fields_dict[field.name] = field_type(label=field.label, 
              required=field.required, 
              help_text=field.help_text, 
              max_length=field.max_length, 
              widget=widget) 

    return fields_dict 

EDIT 4:DEF字段(個體)。從models.py:

def fields(self): 
     fields_list = [] 
     fields = list(self.category.field_set.all()) 
     fields += list(Field.objects.filter(category=None)) 

     for field in fields: 
      try: 
       fields_list.append((field, field.fieldvalue_set.get(ad=self),)) 
      except FieldValue.DoesNotExist: 
       pass # If no value is associated with that field, skip it. 

     return fields_list 

    def field(self, name): 
     if name == 'title': 
      return self.title 
     else: 
      return FieldValue.objects.get(field__name=name, ad=self).value 
+0

您是否在使用的ModelForm或範式?原來的問題並不清楚。如果您使用的是正常表單,則需要將這些字段添加到表單中。 – 2012-08-15 15:11:24

+0

我正在使用BaseForm,而不是ModelForm。感謝您的評論。 [這是一個鏈接](http://docs.nullpobug.com/django/trunk/django.forms.forms.BaseForm-class.html)到BaseForm信息。 [這是一個鏈接](https://github.com/django/django/blob/master/django/forms/forms.py)到django的源代碼BaseForm類。感謝您的任何想法。 – 2012-08-15 15:15:38

+0

恩,我沒有投下任何票。我不確定你在使用什麼 – 2012-08-15 15:45:46

回答

1

那GitHub鏈接應該是第一件事在你的問題

django-classifieds application有一個動態字段的整個系統(基於FieldFieldValue模型),這就是爲什麼你有麻煩。如果您不完全瞭解django-classifieds的這一方面,我建議您將您的項目建立在其他方面。

向下看的FIELD_CHOICESdjango-classifiedmodels.py列表中,您不能使用此數據庫驅動場系統定義relationsips - 所以沒有動態的每類ForeignKey場!

另一種方法是增加你的A模型photographer場(你從Ad更名爲任何特別的原因嗎?),因爲它似乎你已經根據您的其他問題進行。去遠方的休息,但是,你需要編輯fields_dict()方法,像這樣:

def fields_dict(self): 
    fields_dict = {} 
    fields_dict['title'] = self.title 
    fields_dict['photographer'] = self.photographer 

    for key, value in self.fields(): 
     fields_dict[key.name] = value.value 

    return fields_dict 
+0

非常感謝@supervacuo。一個非常徹底的解釋。在努力簡化和簡化我的問題的努力中,我讓它變得難以理解。我對這種困惑表示歉意,非常感謝您花時間詳細闡述。這個教學過程給了我很多知識,我爲此感謝你。 – 2012-08-21 19:15:02

1

您對BaseForm.__init__通話似乎是錯誤的;你應該使用super(),像這樣

class AForm(BaseForm): 
    def __init__(self, *args, **kwargs): 

     super(AForm, self).__init__(*args, **kwargs) 
     self.fields['photographer'].queryset = Photographer.objects.all() 

(如羅布·奧斯本的接受的答案其實建議您的其他問題)。

除此之外,我懷疑你的fields_dict()方法,它不是Django的一部分,你沒有提供定義。確認print self.fields.keys(),無論出於什麼神祕原因,photographer不存在,然後發佈代碼爲fields_dict()

+0

感謝您的回答@ supervacuo。我已經嘗試執行'super()'如上面對我的問題的編輯中所示。不幸的是,我仍然無法弄清楚爲什麼有一個攝影師的KeyError。任何想法可以幫助我解決這個問題?非常感謝 – 2012-08-15 19:14:21

+0

請閱讀我答案的第二部分。將'fields_dict()'的代碼添加到您的問題中。 – supervacuo 2012-08-15 20:25:06

+0

在上面的問題中增加了'fields_dict()'。感謝您提供任何建議@supervacuo。 – 2012-08-15 20:39:26