Как предварительно заполнить форму данными, полученными при предыдущей отправке формы HTML в Django? - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь заполнить свой ModelForm некоторыми данными, которые я отправил на предыдущую HTML-страницу, которая также является ModelForm. Я просто хочу передать его в другую форму, чтобы его не нужно было писать дважды.

Я пробовал пару решений от stackoverflow, но им уже более 6 лет, они устарели и также не смогли найти решение из django docs https://docs.djangoproject.com/en/2.2/topics/forms/ У меня есть две модели, которые имеют одинаковые поля, которые name и boxid Мне нужно передать его от первого ввода ко второму (для его заполнения).

forms.py

class NewCashierForm(forms.ModelForm):
    class Meta:
        model = Cashier
        fields = ("cashier_company", "cashier_dealer", "cashier_name", "cashier_boxid", "cashier_type", "cashier_package", "cashier_otheritem", "cashier_otheritemserial", "cashier_length", "cashier_promotion", "cashier_amount", "cashier_paymenttype")
        labels = {"cashier_company":('Firma'), "cashier_dealer": ('Diler'), "cashier_name":('Ime i prezime'), "cashier_boxid":('Box ID'), "cashier_type":('Tip'), "cashier_package":('Paket'), "cashier_otheritem":('Drugi uredjaj'), "cashier_otheritemserial":('SBU'), "cashier_length":('Dužina'), "cashier_promotion":('Promocija'), "cashier_amount":('Iznos'), "cashier_paymenttype":('Nacin uplate')}
        exclude = ['cashier_published']


def save(self, commit=True):
    cashier = super(NewCashierForm, self).save(commit=False)
    if commit:
        cashier.save()
    return cashier



class NewPersonForm(forms.ModelForm):
    class Meta:
        model = Person
        fields = {"person_name", "person_adress", "person_phone", "person_boxid"}
        labels = {"person_name":('Ime i prezime'), "person_adress":('Adresa'), "person_phone":('Telefon'), "person_boxid":('Box ID')}

def save(self, commit=True):
    person = super(NewPersonForm, self).save(commit=False)
    if commit:
        person.save()
    return person

views.py

def addcashier(request):

    if request.method == 'GET':
        form = NewCashierForm()
    else:
        form = NewCashierForm(request.POST)
        if form.is_valid():
            fs = form.save(commit=False)
            fs.user = request.user
            fs.save()

            return redirect('/byauthor')
    return render (request, 'main/addcashier.html', {'form':form})

def addperson(request):

    if request.method == 'GET':
        form = NewPersonForm()
    else:
        form = NewPersonForm(request.POST)
        if form.is_valid():
            fs = form.save(commit=False)
            fs.user = request.user
            fs.save()

            return redirect('/addcashier')

    return render (request, 'main/addperson.html', {'form':form})

addperson.html и addcashier.html

{% extends "main/base.html" %}


{% block content %}

    <form method="POST">
        {% csrf_token %}

        {{form.as_p}}

        <button class="btn" type="submit">Unos i dodavanje pretplate</button>
    </form>

    <input type="button" value="Otkazi unos" onclick="window.history.back()" /> 

{% endblock %}

Любая помощь и / или подсказка приветствуется.

1 Ответ

1 голос
/ 19 апреля 2019

Чтобы предварительно заполнить форму, вам необходимо передать аргумент initial={} при инициализации формы для вызова GET.Поскольку вы передаете данные из одного представления в другое, вы должны использовать сеансов .

def addperson(request):

    if request.method == 'GET':
        form = NewPersonForm()
    else:
        form = NewPersonForm(request.POST)
        if form.is_valid():
            fs = form.save(commit=False)
            fs.user = request.user
            fs.save()
            request.session["person_form"] = request.POST.dict()  #save the form as a dict in request.sessions

            return redirect('/addcashier')

    return render (request, 'main/addperson.html', {'form':form})

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

def addcashier(request):

    if request.method == 'GET':
        # get the form data from the request.session
        form_data = request.session.pop('person_form', {})
        box_id = form_data.get("person_boxid")
        name = form_data.get("person_name")

        form = NewCashierForm(initial={"cashier_name":name, "cashier_boxid":box_id})  # initialize the form with the data

    else:
        form = NewCashierForm(request.POST)
        if form.is_valid():
            fs = form.save(commit=False)
            fs.user = request.user
            fs.save()

            return redirect('/byauthor')
    return render (request, 'main/addcashier.html', {'form':form})

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