2013-04-03 12 views
47

Vì vậy, tôi có mô hình TagStatus của mình. Tôi đang cố tạo một ModelForm cho nó. Tuy nhiên, biểu mẫu của tôi yêu cầu đầu vào bị ẩn phải được điền bằng {{tag.name}}. Tôi đã xem qua các tài liệu và tôi không biết cách làm cho trường thẻ là một đầu vào bị ẩn. Có lẽ một ModelForm không phải là con đường để đi?Django ModelForm để có một đầu vào ẩn

models.py:

class TagStatus(models.Model): 
    user = models.ForeignKey(User, null=True, unique=True) 
    status = models.CharField(max_length=2, choices=tag_statuses) 
    tag = models.ForeignKey(Tag, null=True, blank=True) 

    def __unicode__(self): 
     return self.status 

    def save(self, *args, **kwargs): 
     super(TagStatus, self).save(*args, **kwargs) 

class TagStatusForm(modelForm): 
    class Meta: 
     model = TagStatus 
     fields = ('status','tag') 
     widgets = { 
      'select': Select, 
      'tag': ??? 
     } 

django views.py:

@login_required 
def tags(request): 
    all_tags = Tag.objects.all() 
    context = base_context(request) 
    if request.method == 'POST': 
     if 'status_check' in request.POST: 
      status_form = TagStatusForm(request.POST) 
      #if request.is_ajax(): 
      if status_form.is_valid(): 
       status_form.save() 
       response = simplejson.dumps({"status": "Successfully changed status"}) 
      else: 
       response = simplejson.dumps({"status": "Error"}) 
       return HttpResponse (response, mimetype='application/json') 
    status_form = TagStatusForm() 
    context['status_form'] = status_form 
    context['all_tags'] = all_tags 
    return render_to_response('tags/tags.html', context, context_instance=RequestContext(request)) 

mẫu:

{% for tag in all_tags %} 
.... 
<form class="nice" id="status-form" method="POST" action=""> 
    {% csrf_token %} 
     <input type="hidden" name="status_check" /> 
     <input type='hidden' name="tag" value="{{ tag.name }}" /> 
    {{ status_form.status }} 
</form> 
... 
{% endfor %} 

Làm thế nào tôi sẽ đi về làm cho một đầu vào ẩn qua một Django ModelForm một d sau đó điền nó thông qua mẫu?

+0

Có gì sai với những gì bạn có? –

Trả lời

89

Để tạo một trường trong trường ModelField là trường ẩn, hãy sử dụng tiện ích HiddenInput. ModelForm sử dụng một widget mặc định hợp lý cho tất cả các trường, bạn chỉ cần ghi đè lên nó khi đối tượng được xây dựng.

class TagStatusForm(forms.ModelForm): 
    class Meta: 
     model = TagStatus 
     widgets = {'tag': forms.HiddenInput()} 
64

Có 3 cách có thể (AFAIK) để render các trường ẩn trong Django -

1. Bạn có thể khai báo một lĩnh vực bình thường trong forms.py nhưng trong các mẫu html của bạn tập tin sử dụng {{ form.field.as_hidden }}

2. trong forms.py trực tiếp sử dụng tiện ích con bị nhập ẩn.

class MyForm(forms.Form): 
    hidden_field = forms.CharField(widget=forms.HiddenInput()) 

Khi bạn đặt trường này là đầu vào bị ẩn, bạn có thể điền giá trị của trường vào mẫu. Bây giờ trường ẩn của bạn đã sẵn sàng để hiển thị.

3. Tương đương biểu mẫu thông thường (nhờ @Modelesq để chia sẻ nugget này). Ở đây không có Django có liên quan. Các thay đổi được thực hiện ở cấp mẫu HTML. <input type="hidden" name="tag" value="{{ tag.name }}" />

+10

Làm thế nào về tôi đi về dân cư nó? Đó là hình thức tương đương thường xuyên sẽ giống như: '' – Modelesq

+0

có điều đó sẽ hoạt động ... –

+0

Bạn có tìm cách điền ? sử dụng '{{tag.name}}' dường như không hoạt động. Bản thân tôi cần '{{forloop.counter}}'… – Ehvince