【问题标题】:handling different forms post request on single page -Django在单个页面上处理不同的表单发布请求-Django
【发布时间】:2021-04-14 00:53:18
【问题描述】:

我是新手,我正在开发一个网站。在这个网站上,我创建了管理面板来管理不同的产品和属性。

我有一个名为 size.html 的页面,并且我应该更改它的名称并使其成为 productAtributes.html 并且在这个单一页面上我想做所有添加、更新、删除针对不同产品属性的操作。

我的代码如下:

models.py

class Product(models.Model):
    prod_ID = models.AutoField("Product ID", primary_key=True)
    prod_Name = models.CharField("Product Name", max_length=30, null=False)
    prod_Desc = models.CharField("Product Description", max_length=2000, null=False)
    prod_Price = models.IntegerField("Product Price/Piece", default=0.00)
    prod_img = models.ImageField("Product Image", null=True)

    def __str__(self):
        return "{}-->{}".format(self.prod_ID,
                                self.prod_Name)
class Size(models.Model):
    size_id = models.AutoField("Size ID", primary_key=True, auto_created=True)
    prod_size = models.CharField("Product Size", max_length=20, null=False)

    def __str__(self):
        return "{size_id}-->{prod_size}".format(size_id=self.size_id,
                                                prod_size=self.prod_size)


class Color(models.Model):
    color_id = models.AutoField("Color ID", primary_key=True, auto_created=True)
    prod_color = models.CharField("Product Color", max_length=50, null=False)

    def __str__(self):
        return "{color_id}-->{prod_color}".format(color_id=self.color_id,
                                                  prod_color=self.prod_color)


class PaperChoice(models.Model):
    paper_id = models.AutoField("Paper Choice ID", primary_key=True, auto_created=True)
    paper_choices_name = models.CharField("Paper Choices", max_length=50, null=False)

    def __str__(self):
        return "{}-->{}".format(self.paper_id,
                                self.paper_choices_name)

views.py

from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.shortcuts import render, redirect

from user.models import *

def size(request):
    if request.method == 'POST':
        size_store = request.POST['prod_size']
        size_update = Size(prod_size=size_store)
        size_update.save()
        return redirect('/admin1/productSize')
    else:
        size_show = Size.objects.all()
        # start paginator logic
        paginator = Paginator(size_show, 3)
        page = request.GET.get('page')
        try:
            size_show = paginator.page(page)
        except PageNotAnInteger:
            size_show = paginator.page(1)
        except EmptyPage:
            size_show = paginator.page(paginator.num_pages)
        # end paginator logic
        return render(request, 'admin1/size.html', {'size_show': size_show})


def size_edit(request, id):
    size_edit = Size.objects.filter(size_id=id)
    return render(request, 'admin1/size.html', {'size_edit': size_edit})


def size_edit_update(request, id):
    if request.method == 'POST':
        size_store = request.POST['prod_size']
        size_update = Size(size_id=id, prod_size=size_store)
        size_update.save()
        return redirect('/admin1/productSize')


def size_delete(request, id):
    size_deletee = Size.objects.filter(size_id=id)
    size_deletee.delete()
    return redirect('/admin1/productSize')

当我为 Size 创建 添加、更新、删除 功能时,我将使用 colorPapaer selection 做同样的事情

size.html

{% extends 'admin1/layout/master.html' %}
{% block title %}Size{% endblock %}
{% block main %}
<h1>
    <center>Size</center>
</h1>
<div class="container">
    <div class="row">
        <div class="col-lg-2"></div>
        <div class="col-lg-10">

            <button type="button" class="btn btn-primary mt-2" data-toggle="modal" data-target="#modal-primary">Add
                Size
            </button>
            <div class="modal fade" id="modal-primary">
                <div class="modal-dialog">
                    <div class="modal-content">
                        <div class="modal-header">
                            <h4 class="modal-title">Add Product Size</h4>
                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                                <span aria-hidden="true">&times;</span></button>
                        </div>
                        <div class="modal-body mt-2">
                            <form action="{% url 'admin-product-size'%}" method="POST" enctype="multipart/form-data">
                                {% csrf_token %}
                                <label>Product Size:</label>
                                <input type="text" name="prod_size" class="form-control w-50"><br>
                                <br>
                                <input type="Submit" name="Submit" value="Submit" class="btn btn-success w-50"><br>

                                <div class="modal-footer justify-content-between">
                                    <button type="button" class="btn btn-outline-light" data-dismiss="modal">Close
                                    </button>
                                </div>
                            </form>
                        </div>
                    </div>
                    <!-- /.modal-content -->
                </div>
                <!-- /.modal-dialog -->
            </div>
            <!-- /.modal -->

            <br>
            {% if size_show %}
            <div class="container-fluid ">
                <div class="row">
                    <div class="card mt-2 border border-secondary">
                        <div class="card-header">
                            <h3 class="card-title ">Product Table</h3>
                        </div>
                        <!-- /.card-header -->
                        <div class="card-body">

                            <table class="table table-bordered border border-info">
                                <thead>
                                <tr>
                                    <th>Product Id</th>
                                    <th>Product Size</th>
                                </tr>
                                </thead>
                                <tbody class="justify-content-center">
                                {% for x in size_show %}

                                <tr>
                                    <td>{{x.size_id}}</td>
                                    <td>{{x.prod_size}}</td>
                                    <td><a href="/admin1/size_edit/{{x.size_id}} "
                                           class="btn btn-outline-primary mt-2"><i
                                            class="fa fa-pencil-square-o" aria-hidden="true"></i></a>
                                        <a href="/admin1/size_delete/{{x.size_id}}"
                                           class="btn btn-outline-danger mt-2"><i
                                                class="fa fa-trash" aria-hidden="true"></i></a>
                                    </td>
                                </tr>

                                {% endfor %}

                                </tbody>
                            </table>

                        </div>
                        <!-- /.card-body -->
                        <div class="card-footer clearfix ">
                            <ul class="pagination pagination-sm m-0 justify-content-center">
                                {% if size_show.has_previous %}
                                <li class="page-item"><a class="page-link"
                                                         href="?page={{size_show.has_previous_page_number}}">
                                    Previous </a>
                                </li>
                                {% endif%}
                                {% for x in size_show.paginator.page_range %}

                                {% if size_show.number == x %}
                                <li class="page-item active"><a class="page-link" href="?page={{x}}">{{x}}</a></li>
                                {% else%}
                                <li class="page-item"><a class="page-link" href="?page={{x}}">{{x}}</a></li>
                                {% endif %}
                                {% endfor %}

                                {% if size_show.has_next %}
                                <li class="page-item"><a class="page-link"
                                                         href="?page={{size_show.has_next_page_number}}"> Next </a>
                                </li>
                                {% endif %}
                            </ul>
                        </div>
                    </div>
                    <!-- /.card -->
                </div>
            </div>
            {% endif %}
            {% if size_edit %}
            {% for x in size_edit %}
            <form action="/admin1/size_data_update/{{x.size_id}}" method="POST">
                {% csrf_token %}
                <label>Size Name:</label>
                <input type="text" name="prod_size" value="{{x.prod_size}}" class="form-control w-50"><br>

                <input type="Submit" name="Submit" value="Submit" class="btn btn-success w-50"><br>
            </form>
            {% endfor %}
            {% endif %}
        </div>
    </div>
</div>
{% endblock %}

为了执行 views.py 我创建了 size.html .Nut 大约在 1012 > 产品属性,对于这些属性,我不想创建单独的 html 页面。

我想对单个 html 页面中的所有属性进行所有操作。有可能吗?

表示根据属性类型请求页面数据应该动态变化,我不必为每个属性创建单独的模板页面。

【问题讨论】:

  • 不,他在这里从表单中获取数据,但我想开发一个模板,其中模板表单根据他们的发布请求而变化。假设我点击了菜单中的属性,那么页面应该在表单中显示尺寸模型的数据并允许我更新它,如果我点击了颜色,那么应该显示颜色模式的数据,所以简而言之我要处理不同的发布请求是单页。页面形式应根据请求动态更改。
  • 好吧,没有模型表单的唯一方法是通过视图传递表单,不要将其硬编码到 HTML 中,而是制作所有表单输入的字典,然后循环它在模板中,这样,您可以为不同的表单设置不同的字段,这就是您想要的吧?如果你愿意,我可以为你写一个完整的答案
  • 是的,请举个例子。

标签: python html django django-forms http-post


【解决方案1】:

您需要在视图中制作表单,而不是模板,我不确定这是否是最佳做法,但这是我认为您可以做到这一点的唯一方法,(使用Class-Based Views 会大大简化此过程) 但如果你想坚持功能,这就是你要做的。

让我们输入一行:

<label>Product Size:</label>
<input type="text" name="prod_size" class="form-control w-50"><br>

让我们使用 Django 的标签,把它变成这样:

<label>{{form.display_name}}:</label>
<input type="text" name="{{form.name}}" class="form-control w-50">

类可能是相同的,但您可以将相同的功能扩展到类或类型字段。

在后端,您想使用嵌套字典制作一个包含所有要显示的元素的列表:

forms = [  # Each form
    [  # Each field within the form, this way, you can have a different amount each time
        {'display_name': 'Product Size',  # label Display name
         'name': 'prod_size'},  # name tag value
        {'display_name': "it's value", # This is a different field
         'name': 'just an example'}  
    ],
]

然后你可以在模板中做一个for循环:

{% for form in forms %}
    {$ for field in form %}
       <label>{{field.display_name}}:</label>
       <input type="text" name="{{field.name}}" class="form-control w-50">

我不确定您要在代码中做什么,所以我没有让这个示例过于具体,但如果您需要,希望它能给您带来灵感,让您走上正确的轨道更多帮助,请询问

【讨论】:

  • 这对您有帮助吗?
猜你喜欢
  • 2015-01-30
  • 2023-03-03
  • 2014-07-28
  • 2015-12-01
  • 2020-10-05
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多