Подтвердить что ты не робот

Django: Как создать форму с пользовательским шаблоном?

У меня есть модель:

class Setting(models.Model):

    class Meta:
        abstract = True

    name = models.CharField(max_length=120, primary_key=True)
    description = models.CharField(max_length=300, blank=True)

class IntegerSetting(Setting):
    value = models.IntegerField()

Я хотел бы создать форму, которая выглядит примерно так:

<form method="POST" action="">
     {% for model in models %}
     <label>{{model.name}}</label> <input value='{{model.value}}' />
     <p>{{model.description}}</p>
     {% endfor %}
</form>

Я не совсем уверен, как это сделать. Возможно, мне нужно использовать набор форм?

from django.forms.models import modelformset_factory
from apps.about.models import Setting, IntegerSetting

def site_settings(request):
    formset = modelformset_factory(IntegerSetting)()

    return render_to_response("about/admin/site-settings.html", {'formset': formset}, RequestContext(request, {}))

Затем в шаблоне я хочу отобразить форму иначе, чем по умолчанию. Однако я не совсем уверен, как обращаться к свойствам модели. Правильно ли это, или есть ли другой способ, которым я должен заниматься этим?

Обновление. Это то, что я сейчас делаю. Он делает именно то, что я хотел бы, кроме стиля. Тем не менее, я чувствую, что он глубоко взломан:

class SettingsForm(ModelForm):
    class Meta:
        model = IntegerSetting

    def as_table(self):
        bound_field = BoundField(self, self.fields['value'], 'value')
        return mark_safe("<tr><td><label>%s</label></td><td>%s\n<p class='help'>%s</p></td></tr>" % (self.instance.name,
                                                                       self.instance.description, 
                                                                       bound_field.__unicode__())) 

def edit_settings(request):
    forms = [SettingsForm(instance=intSetting) for intSetting in IntegerSetting.objects.all()]

    return render_to_response("admin/edit-settings.html", {'forms': forms}, RequestContext(request, {}))

редактировать-settings.html

{% extends "admin/base_site.html" %}
{% block title %}System Settings{% endblock %}

{% block content %}
    <form method="post" action="">
        <table>
        {% for form in forms %}
        {{form}}
        {% endfor %}
        </table>
    </form>
{% endblock %}

Есть ли лучший подход к этому?

Кроме того, я не уверен, что у меня возникнут проблемы при отправке формы.

4b9b3361

Ответ 2

Я не думаю, что вам нужен набор форм здесь. Посмотрите здесь, если вы хотите создать собственный шаблон для одного представления. Если вы хотите создать свой собственный {{form.as_foobar}}, просто подкласс forms.Form, что-то вроде этого:

class MyForm(forms.Form):
  def as_foobar(self):
    return self._html_output(
      normal_row = u'%(label)s %(field)s%(help_text)s',
      error_row = u'%s',
      row_ender = '',
      help_text_html = u' %s',
      errors_on_separate_row = False)

и просто используйте его в своих формах .py:

class ContactForm(MyForm):
  # ..

Ответ 3

Для тех, кому нужна версия ответа <table> jbcurtin:

<form method="post">{% csrf_token %}
  <table>
    {% for field in form %}
      <tr>
        <th>{{field.label_tag}}</th>
        <td>
          {{ field.errors }}
          {{ field }}
        </td>
      </tr>
    {% endfor %}
  </table>
  <hr/>
  <input type="submit" value="Conferma" />
</form>

Ответ 4

Похоже, вас может заинтересовать django-floppyforms (docs), что дает вам гораздо больший контроль над рендерингом полей.