2011-06-13 102 views
4

django文檔建議我可以從我的模板中識別隱藏/可見字段。我有兩個模型,AddressInfo和PharmacyInfo。我需要從一個頁面輸入兩個表的數據。我想隱藏address_id字段(來自PharmacyInfo模型)。我目前有:從django模型中隱藏字段

{% for form in formset %} 
    {% if form.non_field_errors %} 
     <div class="form_errors"> 
      {{ form.non_field_errors }} 
     </div> 
    {% endif %} 

    {% for field in form.visible_fields%} 
     <div class="field_content">     
       <label>{{field.label_tag }}</label> 
     <div class="field"> 

      {% if field.help_text %} 
      <div class = "help_text"> 
       {{ field.help_text }} 
      </div> 
      {% endif %}    
       {{ field }} 
       {{ field.errors }} 
     </div> 
     </div> 
    {% endfor %} 
{% endfor %} 



class PharmForm(ModelForm): 
    class Meta: 
     model = PharmInfo 
     widgets = { 
      'address_id': forms.HiddenInput() 
     } 



class AddressForm(ModelForm): 
    class Meta: 
     model = AddressInfo 



class AddressInfo(models.Model): 
    address_id = models.AutoField(primary_key=True) 

    address_1 = models.CharField("Address Line 1", max_length = 64) 
    address_2 = models.CharField("Address Line 2", max_length = 64, blank=True, null=True) 
    address_3 = models.CharField("Address Line 3", max_length = 64, blank=True, null=True) 
    address_4 = models.CharField("Address Line 4", max_length = 64, blank=True, null=True) 
    town_city = models.CharField("Town or City", max_length = 32) 
    post_code = models.CharField("Post Code", max_length = 8) 
    phone = models.CharField("Phone Number - numbers 0-9 only", 
         max_length = 16) #this must be numeric 0-9 only for auto-dial functionality. 
    email = models.CharField("email address", max_length = 64) #must be valid email 



class PharmInfo(models.Model): 
    pharm_id = models.AutoField(primary_key=True) 
    pharm_name = models.CharField("Pharamcy Name", max_length = 64) 
    address_id = models.ForeignKey(AddressInfo, db_column="address_id") 



def pharmView (request, id=None): 
    pharmForm = PharmForm() 
    addForm = AddressForm() 
    if request.method == 'POST': #this is a form submission 
     if id == None: #it's a new record 
      pharmForm = PharmForm(request.POST) 
      addForm = AddressForm(request.POST) 
      if addForm.is_valid(): #add the address_id into the pharmForm. 
       request.POST = request.POST.copy() 
       request.POST['address_id'] = addForm.save().pk 
       pharmForm = PharmForm(request.POST) 
       if pharmForm.is_valid(): 
        pharm = pharmForm.save() 
        return render_to_response('thanks.html', 
         {'form1': pharmForm, 
         'form2': addForm}, 
         context_instance=RequestContext(request), 
        ) 

     else: #it's an existing record 
      pharm = PharmInfo.objects.get(pk=id) 
      address = pharm.address_id 
      pharmForm = PharmForm(request.POST, instance = pharm) 
      addForm = AddressForm(request.POST, instance = address) 
      if pharmForm.is_valid() and addForm.is_valid(): 
       pharmForm.save() 
       addForm.save() 
       return render_to_response('updateThanks.html', 
        {'form1': pharmForm, 
        'form2': addForm}, 
        context_instance=RequestContext(request), 
       ) 
    else: 
     if id != None: #form bound to a pharmacy record 
      pharm = PharmInfo.objects.get(pk=id) 
      address = pharm.address_id 
      pharmForm = PharmForm(instance = pharm) 
      addForm = AddressForm(instance = address) 
      return render_to_response('institutions/pharm.html', 
       {'form1': pharmForm, 
       'form2': addForm}, 
       context_instance=RequestContext(request), 
       )    

    return render_to_response('institutions/pharm.html', 
      {'form1': pharmForm, 
      'form2': addForm}, 
      context_instance = RequestContext(request), 
     ) 

此代碼隱藏address_id字段的輸入框,但標籤仍顯示。我想隱藏整個div,但'form.visible_fields'不會將它從輸出中排除。這讓我瘋狂。任何人都可以告訴我如何以模板可見的方式標記address_id字段。

+0

很久以前我有類似的問題。我最終創建了一個forms.Form子類,它指定了應該單獨顯示哪些字段,因此非常遺憾Django無法爲您生成此類表單。好處是我仍然在使用Django的標準組件,但可能會留下不必要的字段,但這是一個相當難看的解決方案。如果你想要的話,可以給你一個例子。 – 2011-06-13 15:31:58

+0

你可以在'PharmInfo'模型中顯示'address_id'字段是如何定義的嗎? – 2011-06-13 15:37:53

回答

0

好吧,看起來我正在編輯我的模板中的錯誤代碼。我想補充

{% for field in form.visible_fields %} 

來,我會註釋掉的模板(我覺得評論很難看到模板線)的一部分。一切工作與下面的代碼在我的模板預期:

{% if form.non_field_errors %} 
     <div class="form_errors"> 
      {{ form.non_field_errors }} 
     </div> 
    {% endif %} 

    {% for field in form.visible_fields %} 
    <div class="field_content"> 
     <label>{{ field.label_tag }}</label> 
    <div class="field"> 

     {% if field.help_text %} 
     <div class = "help_text"> 
      {{ field.help_text }} 
     </div> 
     {% endif %} 

     {{ field }} 
     {{ field.errors }} 
    </div> 
    </div> 
    {% endfor %} 

道歉的人誰在這個花費的時間(我會早發佈,但被新來的StackOverflow我沒有被允許在8回答我的問題小時張貼)。

19

如果你沒有在address_id場打算在表單中的所有編輯,你應該使用exclude元場爲Using a subset of fields in the form記錄。

結果應該是這樣的:

class PharmForm(ModelForm): 
    class Meta: 
     model = PharmInfo 
     exclude = ('address_id',) 

注意,這將阻止address_id場從通過表單被設置(檢查的文檔的例子下的說明)。

+1

我需要將PharmForm.address_id包含在表單中。它在AddressForm保存時創建 - 而不是由用戶輸入。 – 2011-06-14 07:52:07