【问题标题】:How to pre-populate form with data received from a previous HTML form submission in Django?如何使用从先前在 Django 中提交的 HTML 表单提交的数据预填充表单?
【发布时间】:2019-04-19 11:49:11
【问题描述】:

我正在尝试使用我提交到之前的 HTML 页面(也是 ModelForm)的一些数据填充我的 ModelForm。 我只是想把它传递给另一个表单,这样就不必写两次了。

我尝试过 stackoverflow 的几个解决方案,但它们已经 6 岁以上,有点过时了,也无法从 django docs https://docs.djangoproject.com/en/2.2/topics/forms/ 中找到解决方案 我有两个模型,它们具有相同的字段 nameboxid 我需要将它从第一个输入传递到第二个输入(以填充它)。

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.htmladdcashier.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 %}

感谢任何帮助和/或提示。

【问题讨论】:

  • 在过去六年中,Django 的表单 API 没有任何变化,因此任何解决方案都应该仍然有效。

标签: python html django


【解决方案1】:

要预填充表单,您需要在为GET 调用初始化表单时传递参数initial={}。由于您将数据从一个视图传递到另一个视图,因此您应该使用sessions

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

【讨论】:

  • 就是这样。感谢您提供的解决方案!它还可以帮助我弄清楚其他事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 2018-06-13
  • 2018-08-15
  • 2021-03-19
相关资源
最近更新 更多