2013-04-03 20 views
47

Mam więc mój model TagStatus. Próbuję zrobić dla niego ModelForm. Jednak mój formularz wymaga, aby ukryte dane wejściowe były wypełnione przez {{tag.name}}. Przeglądałem dokumenty i nie wiem, jak uczynić pole znacznika ukrytym wpisem. Być może ModelForm nie jest do zrobienia?Django ModelForm ma ukryte dane wejściowe

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)) 

szablon:

{% 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 %} 

Jak bym go o dokonanie przez ukryte wejście django ModelForm an d następnie wypełnić go przez szablon?

+0

Co jest nie tak z tym, co masz? –

Odpowiedz

89

Aby pole w polu ModelField było ukrytym polem, użyj widgetu HiddenInput. ModelForm używa sensownego domyślnego widgetu dla wszystkich pól, wystarczy go przesłonić, gdy obiekt zostanie skonstruowany.

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

Istnieją 3 sposoby (AFAIK) do renderowania ukrytych pól w Django -

1. Można zadeklarować pola normalnie w forms.py ale w szablonach html stosowania plików {{ form.field.as_hidden }}

2. w forms.py użyj bezpośrednio ukrytego widżetu wejściowego.

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

Po utworzeniu ukrytego pola można wypełnić wartość pola w szablonach. Teraz twoje ukryte pole jest gotowe do renderowania.

3. Zwykły odpowiednik formularza (dzięki @Modelesq za udostępnienie tego modelu użytkowego). Tutaj nie jest zaangażowany Django. Zmiany dokonywane są na poziomie szablonu HTML. <input type="hidden" name="tag" value="{{ tag.name }}" />

+10

Co powiesz na to, że go zapełniam? Wygląda to jak zwykły odpowiednik formularza: '' – Modelesq

+0

tak by działało ... –

+0

Czy znalazłeś sposób wypełnienia ? użycie '{{tag.name}}' wydaje się nie działać. Sam potrzebuję '{{forloop.counter}}' ... – Ehvince

Powiązane problemy