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.

Author: Krystian Cybulski, 2009-02-06

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

 34
Author: Van Gale,
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

 50
Author: Carl Meyer,
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'

 16
Author: Joe Holloway,
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.

Jednolite helpery mogą używać obiektów Układu. Układ może składać się z pól, wierszy, kolumn, HTML i pól .

Pierwotnie wybrałem Django-UNI-form, ponieważ jest zgodne z sekcja 508 .

 4
Author: oivvio,
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>
 0
Author: Wtower,
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