2012-05-23 40 views
0

我正在嘗試集成一個名爲Django-Classifieds的應用程序,但我無法弄清楚如何操縱一些元素。模型中的Django表格

該應用程序允許通過管理部分創建一個類別和子字段,該部分將顯示並允許用戶在該類別內創建一個帖子。雖然Django管理允許一個創建字段:

DJango Admin

,並將其寫入到數據庫:

enter image description here

我無法弄清楚如何調用這些領域,並將其顯示給用戶。目前只顯示標題字段。據我所知,使用的ModelForm讓我訪問這些元素,但我不知道如何與基本形式(在應用程序如下使用),其併入:

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

    self.instance = instance 
    object_data = ad_to_dict(self.instance) 
    self.declared_fields = SortedDict() 
    self.base_fields = fields_for_ad(self.instance) 

    # if initial was provided, it should override the values from instance 
    if initial is not None: 
     object_data.update(initial) 

    BaseForm.__init__(self, data, files, auto_id, prefix, object_data, 
         error_class, label_suffix, empty_permitted) 

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

    if self.errors: 
     raise ValueError("The ad 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(stripHTML(cleaned_data[field.name])) 
     else: 
      value = unicode(cleaned_data[field.name]) 

     # strip words in settings.FORBIDDEN_WORDS 
     for word in settings.FORBIDDEN_WORDS: 
      value = value.replace(word, '') 

     # title is stored directly in the ad, unlike all other editable fields 
     if field.name == 'title': 
      self.instance.title = value 
      self.instance.save() 
     else: 
      # check to see if field.fieldvalue_set has a value with ad=self.instance 
      try: 
       # if it does, update 
       fv = field.fieldvalue_set.get(ad=self.instance) 
      except FieldValue.DoesNotExist: 
       # otherwise, create a new one 
       fv = field.fieldvalue_set.create(ad=self.instance) 

      # XXX some ugly price fixing 
      if field.name.endswith('price'): 
       m = re.match('^\$?(\d{1,3},?(\d{3},?)*\d{3}(\.\d{0,2})?|\d{1,3}(\.\d{0,2})?|\.\d{1,2}?)$', value) 
       value = m.group(1) 
       value.replace(',', '') 
       value = '%.2f' % float(value) 

      fv.value = value 
      fv.save() 

    return self.instance 

我如何可以顯示所有已創建領域上面的AdForm

任何例子讚賞。謝謝。

回答

1

因爲AdForm類的目的是允許訪問這些字段,所以不需要併入ModelForm。爲了顯示添加到數據庫中某個類別的自定義字段,只需將這些字段添加到相應類別的模板中(假設您使用的是應用程序中提供的視圖)。在分類應用程序中的「基本」類別模板中有這樣的例子。

+0

非常感謝您的回覆@Saebyn。您是否介意幫助我理解模板中使用的正確的{{variable}}名稱,以便從數據庫訪問表單字段(例如,對於描述字段)? –

+1

你應該可以做'{{form.Descripion}}'。請注意,字段名稱的大小寫應與數據庫中字段名稱的大小寫匹配。你使用的是哪個版本的Django? Django的更新版本可能會出現項目主分支的問題。我一直在分支上支持Django 1.3,所以你可能想看看那裏。 – saebyn

+0

我一直在使用Django 1.4,但會看1.3和你建議的分支。非常感謝你的見解。 –