Как сделать условно обязательными поля формы Django? - PullRequest
1 голос
/ 07 мая 2020

Я новичок в Django и пытаюсь научиться создавать веб-приложения. Я пытаюсь удалить запись без обязательных полей формы. Я хочу, чтобы они требовались только при создании новой записи. Вот снимок экрана:

введите описание изображения здесь

Вот мой form.py:

from django import forms

class ExpenseForm(forms.Form):
    name = forms.CharField(
        max_length=255,
        widget=forms.TextInput(attrs={
            "class": "form-control",
            "placeholder": "Expense Name"
        })
    )
    amount = forms.DecimalField(
        max_digits=16,
        decimal_places=2,
        widget=forms.NumberInput(attrs={
            "class": "form-control",
            "placeholder": "$400.00"
        })
    )

Вот мой view.py :

from django.shortcuts import render
from budget.models import Expense
from .forms import ExpenseForm
from django.http import HttpResponse, HttpResponseRedirect
from django.db.models import Sum

def budget_view(request):
    expenses = Expense.objects.all()
    total = Expense.objects.aggregate(total=Sum('amount'))['total']

    form = ExpenseForm()
    if request.method == 'POST':
        form = ExpenseForm(request.POST)
        if form.is_valid() and 'create-expense' in request.POST:
            expense = Expense(
                name=form.cleaned_data["name"],
                amount=form.cleaned_data["amount"]
            )
            expense.save()

            return HttpResponseRedirect('/')

        elif form.is_valid() and 'edit-expense' in request.POST:

            return HttpResponseRedirect('/')

        else:
            expense = Expense.objects.get(id=request.POST.get("delete-expense"))
            expense.delete()

            return HttpResponseRedirect('/') 

    context = {
        "form": form,
        "expenses": expenses,
        "total": total,
    }

    return render(request, "budget_view.html", context)

Я пробовал добавить form.fields[<field_name>].required() = False в блок else, но безуспешно. Нужно ли мне создавать собственный clean () в form.py для проверки каждого файла поля или есть еще что-нибудь, что я могу попробовать?

Заранее спасибо

1 Ответ

0 голосов
/ 07 мая 2020

form.fields[<field_name>].required = False - это правильно, за исключением того, что после required нет скобок.

Кроме того, я думаю, что немного проще сделать поля необязательными по умолчанию и изменить их на требуется при необходимости.

Сделайте это в методе формы __init__, например:

class ExpenseForm(forms.Form):
    name = forms.CharField(
        required=False,
        ... # same
    )
    amount = forms.DecimalField(
        required=False,
        ... # same
    )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if "create-expense" in self.data or "edit-expense" in self.data:
            form.fields["name"].required = True
            form.fields["amount"].required = True


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