Как эффективно исходные данные в формах Django.Form? - PullRequest
2 голосов
/ 28 марта 2011

Например, у меня есть модель статьи для статей в блоге, поэтому легко добавлять статьи в базу данных.

Но когда мне нужно отредактировать их, в форме, если я создаю класс формы с помощью form.ModelForm, я могу передать instace=artcile форме и все.

Но если я создаю класс формы с помощью form.Forms, я должен объявить экземпляр формы и передать поля в форму по одному.

как то так

form = ArticleForm({
    'title': article.title,
    'body': article.body,
    'pub_date': article.pub_date
    'status': article.status,
    'author': article.author,
    'comments': article.comments.count(),
    'blah': article.blahblah,
    'againBlah': article.againBlah,
    .....
})

Это ужасно, не так ли? Есть ли способ сделать это короче, без использования form.ModelForm?

1 Ответ

2 голосов
/ 28 марта 2011

Вы можете использовать утилиты model_to_dict и fields_for_model из django.forms.models:

# assuming article is an instance of your Article model:
from django.forms import Form
from django.forms.models import fields_for_model, model_to_dict

form = Form(model_to_dict(article))
form.fields.update(fields_for_model(article))

Если у вас есть отношение m2m, вы можете создать для него набор форм:

from django import forms
from django.forms.models import model_to_dict, fields_for_model
from django.forms.formsets import formset_factory

# assuming your related model is called 'Tag'
class TagForm(forms.Form):

    def __init__(self, *args, **kwargs):
        super(TagForm, self).__init__(*args, **kwargs)
        self.fields.update(fields_for_model(Tag))


TagFormSet = formset_factory(TagForm)
formset = TagFormSet(initial=[model_to_dict(tag) for tag in article.tags.all()])

Затем вы можете выполнить итерацию по набору форм для доступа к формам, созданным для связанных моделей:

for form in formset.forms:
    print form
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...