Django i fieldsets na ModelForm
Wiem, że możesz określić fieldsets w django dla adminów helperów. Nie mogę jednak znaleźć niczego przydatnego dla Modelform. Tylko kilka łatek, których nie mogę użyć. Coś przeoczyłem? Czy istnieje sposób, w jaki mógłbym osiągnąć coś takiego jak zestawy pól bez ręcznego wypisywania każdego pola na moim szablonie w odpowiednim tagu.
Chciałbym przeprowadzić iterację przez zbiór Boundfieldów. Jednak robienie czegoś takiego na końcu mojej ModelForm:
fieldsets = []
fieldsets.append(('Personal Information',
[username,password,password2,first_name,last_name,email]),) # add a 2 element tuple of string and list of fields
fieldsets.append(('Terms & Conditions',
[acceptterms,acceptprivacy]),) # add a 2 element tuple of string and list of fields
Fails as the items w mojej strukturze danych zawarte są pola surowe, a nie Pola BoundFields. t wygląda na to, że BoundFields są generowane w locie... to mnie zasmuca. Czy mogę stworzyć własną podklasę formularzy?Forma, która zawiera pojęcie pól (nawet szorstkich, które nie są kompatybilne wstecznie... to jest tylko dla mojego własnego projektu) a jeśli tak, to czy możesz dać jakieś wskazówki? Nie chcę zadzierać z kodem django.
5 answers
Zestawy pól w Modelform są nadal w fazie" projektowania". Jest Bilet w Django trac z niską aktywnością.
To jest coś, co interesuje mnie w najbliższej przyszłości, ale ponieważ jeszcze tego nie zrobiłem, najlepsze co mogę zaoferować to te fragmenty:
Edit: właśnie zauważyłem to pytanie ponownie i zdaję sobie sprawę, że potrzebuje edycji, aby wskazać projekt Carla django-form-utils, który zawiera klasę BetterForm, która może zawierać zestawy pól. Jeśli podoba Ci się ten projekt daj mu +1 za jego odpowiedź poniżej:)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-10 22:34:18
Myślę, że Ten fragment robi dokładnie to, co chcesz. Daje Ci podklasę formularza, która pozwala deklaratywnie podzielić formularz na zestawy pól i iterację przez nie w szablonie.
Update: ten fragment stał się częścią django-form-utils
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-24 18:11:51
Jedną z rzeczy, które możesz zrobić, to rozbić swoje pola logiczne na oddzielne klasy formularzy modelu.
class PersonalInfoForm (forms.ModelForm):
class Meta:
model=MyModel
fields=('field1', 'field2', ...)
class TermsForm (forms.ModelForm):
class Meta:
model=MyModel
fields=('fieldX', 'fieldY', ...)
Przekaż je do szablonu w różnych zmiennych i podziel formularze:
<form ...>
<fieldset><legend>Personal Information</legend>
{{ personal_info_form }}
</fieldset>
<fieldset><legend>Terms and Conditions</legend>
{{ terms_form }}
</fieldset>
</form>
W tym sensie każda z klas formularza jest tylko fragmentem rzeczywistego formularza HTML.
Wprowadza odrobinę złożoności, gdy wywołujesz save w formularzu. Prawdopodobnie będziesz chciał przekazać commit = False, a następnie scalić wynikowe obiekty. Lub po prostu unikaj używania ModelForm.Zapisz w całości i wypełnić obiekt modelu ręcznie 'cleaned_data'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-06 22:32:39
Daniel Greenfelds django-UNI-form rozwiązuje to za pomocą klasy pomocniczej układu. Właśnie go wypróbowuję i wygląda na całkiem czysty.
Pierwotnie wybrałem Django-UNI-form, ponieważ jest zgodne z sekcja 508 .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-08 13:53:05
To był kod, który opracowałem w celu zrozumienia niestandardowych tagów (z linkami). Użyłem go do stworzenia zestawu pól.
Zastrzeżenie: zachęcam do korzystania z którejkolwiek z powyższych odpowiedzi, to było tylko dla dobra nauki.
templatetags/myextras.py
:
from django import template
from django.template import Context
register = template.Library()
class FieldsetNode(template.Node):
""" Fieldset renderer for 'fieldset' tag """
def __init__(self, nodelist, fieldset_name):
""" Initialize renderer class
https://docs.djangoproject.com/en/1.8/howto/custom-template-tags/#writing-the-renderer
:param nodelist: a list of the template nodes inside a block of 'fieldset'
:param fieldset_name: the name of the fieldset
:return: None
"""
self.nodelist = nodelist
self.fieldset_name = fieldset_name
def render(self, context):
""" Render the inside of a fieldset block based on template file
https://docs.djangoproject.com/en/1.8/howto/custom-template-tags/#auto-escaping-considerations
:param context: the previous template context
:return: HTML string
"""
t = context.template.engine.get_template('myapp/fieldset.html')
return t.render(Context({
'var': self.nodelist.render(context),
'name': self.fieldset_name,
}, autoescape=context.autoescape))
@register.tag
def fieldset(parser, token):
""" Compilation function for fieldset block tag
Render a form fieldset
https://docs.djangoproject.com/en/1.8/howto/custom-template-tags/#writing-the-compilation-function
https://docs.djangoproject.com/en/1.8/howto/custom-template-tags/#parsing-until-another-block-tag
:param parser: template parser
:param token: tag name and variables
:return: HTML string
"""
try:
tag_name, fieldset_name = token.split_contents()
except ValueError:
raise template.TemplateSyntaxError("%r tag requires a single argument" % token.contents.split()[0])
if not (fieldset_name[0] == fieldset_name[-1] and fieldset_name[0] in ('"', "'")):
raise template.TemplateSyntaxError("%r tag's argument should be in quotes" % tag_name)
nodelist = parser.parse(('endfieldset',))
parser.delete_first_token()
return FieldsetNode(nodelist, fieldset_name[1:-1])
templates/myapp/fieldset.html
:
<div class="fieldset panel panel-default">
<div class="panel-heading">{{ name }}</div>
<div class="panel-body">{{ var }}</div>
</div>
templates/myapp/myform.html
:
<form action="{% url 'myapp:myurl' %}" method="post">
{% csrf_token %}
{% fieldset 'General' %}
{{form.myfield1 }}
{% endfieldset %}
{# my submit button #}
</form>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-07 10:02:00