2011-06-13 104 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