Как я могу использовать один вид для разных форм в Django - PullRequest
0 голосов
/ 28 июня 2011

У меня есть 5 моделей форм, как показано ниже

    class AccountForm(ModelForm):
          class Meta:
             model = Account

    class TransactionForm(ModelForm):
          class Meta:
             model = Transaction
.
.
.
.

Теперь для первой формы у меня есть это представление

def create_account(request, acc_id=None):
    if acc_id:
        f = Account.objects.get(pk=acc_id)
        act1 = 'update/' + acc_id
    else:
        f = None
        act1 = 'create'

    if request.method == 'POST': # If the form has been submitted...
        form = AccountForm(request.POST, request.FILES, instance=f) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            form.save()
            return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = AccountForm(instance=f) # An unbound form

    return render_to_response('account_form.html', {
        'form': form,
        'action':act1,
        'type':'account',
    })

Теперь это представление выполняет редактирование и создание новой AccountForm.

Но я должен сделать то же самое для других пяти форм. Теперь я должен скопировать один и тот же код 5 раз с незначительными изменениями. Мне нужно выполнить одну и ту же операцию, только имя формы будет другим.

Есть ли способ использовать одну функцию для всех ModelForms.

Шаблон, который я использую, это

<form action="/{{type}}/{{ action }}/" method="post" enctype="multipart/form-data" >
    {% csrf_token %}
    {% for field in form %}
        <div class="fieldWrapper">
            {{ field.errors }}
            {{ field.label_tag }}: {{ field }}
        </div>
    {% endfor %}
    <p><input type="submit" value="Submit" /></p>
    </form>

так что в принципе шаблон тоже такой же

Мой URL.py также должен копировать такие же строки, как показано ниже

   (r'^account/create/$', create_account),
    (r'^account/update/(\d)/$', create_account),
    (r'^txn/create/$', create_txn),
    (r'^txn/update/(\d)/$', create_txn),

Есть ли возможность уменьшить код

Ответы [ 2 ]

3 голосов
/ 28 июня 2011

Сохраните формы в словаре, используя название модели.

FORMS = {
    'account': AccountForm,
    'transaction': TransactionForm,
    ...
}

def create_object(request, object_class, object_id=None):
    form_class = FORMS[object_class]
    model = form_class._meta.model
    if object_id:
        object = model.object.get(pk=object_id)

... и т. Д.

0 голосов
/ 28 июня 2011

Посмотрите, как люди делают что-то подобное в Джанго Дженерик Вью .

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