如何在Django中显示或呈现多个窗体

2024-09-30 14:21:30 发布

您现在位置:Python中文网/ 问答频道 /正文

enter image description here

我目前正在一个个人项目中工作,在一个页面(购买页面)中,将有主表单(包括产品名称、产品类别和产品规格字段)

现在,有一个链接“添加新产品类别”激活模式。该模态包括一个单独的形式

您看到的是最终输出,或者我希望页面是什么样子,我只是用html做的,不涉及django编码

我(愚蠢的)问题是,我将如何显示这两种形式?我不明白{{form}}是如何工作的

我使用代码{{form}}成功地在模式中呈现了productCategoryForm,但在第二个表单productDetailsForm中执行相同操作时,它不会呈现或显示。它是空白的。我不确定这将如何运作

下面是我的Views.py和Forms.py代码

视图.py

def addNewProduct(响应):

c_form = productCategoryForm(response.POST)
p_form = productDetailsForm(response.POST)

if response.method == "POST":

    if c_form.is_valid():
        a = c_form.cleaned_data["productCategField"]
        b = productCategoryModel(productcategoryCol=a)
        b.save()
    return HttpResponseRedirect("/acctg/purchases/")

    if p_form.is_valid():
        c = p_form.cleaned_data["productNameField"]
        d = productModel(productnameCol=c)
        d.save()
    return HttpResponseRedirect("/acctg/purchases/")


context =  {
    "p_form": p_form,
    "c_form": c_form
}        

return render(response, 'purchases.html', context)

Forms.py

class productCategoryForm(forms.Form):
    productCategField = forms.CharField(label="Product Category", max_length=100, widget= forms.TextInput(attrs={'class':'form-control col-sm-8 col-form-label'}))

class productDetailsForm(forms.Form):   
    productNameField = forms.CharField(label="Product Name", max_length=100, required=True, widget=forms.TextInput(attrs={'placeholder':'Enter Product Name', 'class':'form-control col-sm-8 col-form-label'}))

型号.py

# Create your models here.
class productCategoryModel(models.Model):
    productcategoryCol = models.TextField()

    def __str__(self):
        return self.productcategoryCol

class productModel(models.Model):
    productnameCol = models.TextField()
    productspecsCol = models.TextField()
    #productcategCol = models.ForeignKey(productcategoryCol, default=None, on_delete=models.CASCADE)

    def __str__(self):
        return self.productnameCol

谢谢你在这方面的帮助。谢谢大家!


Tags: pyselfformreturnmodelsresponsedefcol
2条回答

为了避免意大利面代码,我通常将视图分开:

# views.py
def purchases(response):
    form = productCategoryForm()
    detailsForm = productDetailsForm()
    
    return render(response, 'purchases.html', {"form": form, "detailsForm": detailsForm})

@require_POST
def add_category(request):
    form = productCategoryForm(response.POST)

    if form.is_valid():
        a = form.cleaned_data["productCateg"]
        b = productCategory(productCat=a)
        b.save()

        return HttpResponseRedirect("/acctg/purchases/")

@require_POST
def add_product_details(request):
    form = productDetailsForm(response.POST)

    if form.is_valid():
        #  your logic here
        b.save()

        return HttpResponseRedirect("/acctg/purchases/")


# urls.py
path('purchases/', purchases, name='purchases'),
path('add_category/', add_category, name='add_category'),
path('add_product_details/', add_product_details, name='add_product_details'),


# purchases.html
            <form action="{% url 'add_category' %}" method="post">
                {% csrf_token %}
                {{form}}
                <button type="submit" class="btn btn-primary">Submit</button>
            </form>


            <form action="{% url 'add_product_details' %}" method="post">
                {% csrf_token %}
                {{detailsForm}}
                <button type="submit" class="btn btn-primary">Submit</button>
            </form>

您可以通过上下文在模板中传递这两个表单


def addNewProduct(request):
    p_form = productDetailsForm()
    c_form = productCategoryForm()
    if request.method == "POST":
        p_form=productDetailsForm(request.POST)
        if p_form.is_valid():
            p_form.save()
            return redirect("/")
    context =  {
           "p_form": p_form,
           "c_form": c_form
             }
    return render(response, 'purchases.html', context)
    

现在,在模板中,您可以使用{{p_form}}{{c_form}}。并为两种形式提供不同的操作和不同的视图

编辑:

如果希望使用单个视图处理两个表单,则可以在模板内的“提交”按钮中使用“名称”属性

模板:

  <form method='POST'>
    {{p_form.as_p}}
    <button type="submit" name="btn1">Add Product</button>
    </form>
    

    <form method='POST'>
    {{c_form.as_p}}
    <button type="submit" name="btn2">Add Category</button>
    </form>

现在在视图中

def addNewProduct(request):
    p_form = productDetailsForm()
    c_form = productCategoryForm()
    if request.method=='POST' and 'btn1' in request.POST:
        p_form=productDetailsForm(request.POST)
        if p_form.is_valid():
            p_form.save()
            return redirect("/")
    if request.method=='POST' and 'btn2' in request.POST:
        c_form=productCategoryForm(request.POST)
        if c_form.is_valid():
            c_form.save()
            return redirect("/")
    context =  {
       "p_form": p_form,
       "c_form": c_form
         }
    return render(response, 'purchases.html', context)

相关问题 更多 >