【问题标题】:how to Update/Edit database content with form in django如何在 django 中使用表单更新/编辑数据库内容
【发布时间】:2021-07-30 13:53:52
【问题描述】:

我正在尝试使用表单更新内容,但在我的 html 中,当我点击链接时不知道是什么导致了错误

我的意见.py

def edit_address(request, id):
    address = Address.objects.filter(id=id)
    form = Addressform(request.POST)
    if form.is_valid():
        form.user = request.user
        form.save()
    else:
        form = Addressform()
    template_name = "address_edit.html"
    context = {
        "form": Addressform,
        "Address":Address.objects.get(id=id),
    }
    return render(request,template_name,context) 

我认为问题出在views.py中,这就是为什么我只添加这个文件告诉我你是否想查看其他文件

我的html

<div class="card col-10">
        <div class="form-group form-control-sm">
            <h1 class="text-center">Edit Address</h1>
            <a  class='back' style="float: right;" href="{% url 'accounts:home' %}">Back to site</a> <br>
            {% for Address in address %}
            <form method="POST">
            {% csrf_token %}
             <div class="col-5">{{ form.reciever_name|as_crispy_field }}</div>
             <div class="col-5">{{ form.phone_no|as_crispy_field }}</div>
             <div class="col-5">{{ form.alt_phone_no|as_crispy_field }}</div>
             <div class="col-5">{{ form.state|as_crispy_field }}</div>
             <div class="col-5">{{ form.city|as_crispy_field }}</div>
             <div class="col-5">{{ form.pincode|as_crispy_field }}</div>
             <div class="col-5">{{ form.address|as_crispy_field }}</div>
             <div class="col-5">{{ form.locality|as_crispy_field }}</div>
             <div class="col-5">{{ form.eighteen|as_crispy_field }}</div>
            <br>
            <button type="submit" class="btn btn-outline-success">Add Address</button>
        </form>
    {% endfor %}
    </div>

【问题讨论】:

    标签: django-models django-views django-forms django-templates


    【解决方案1】:

    您需要获取要编辑的地址的instance,并将其作为instance=…传递给AddressForm

    from django.shortcuts import get_object_or_404, redirect
    
    def edit_address(request, id):
        address = get_object_or_404(Address, id=id)
        if request.method == 'POST':
            form = Addressform(request.POST, instance=address)
            if form.is_valid():
                form.instance.user = request.user
                form.save()
                return redirect('name-of-some-view')
        else:
            form = AddressForm(instance=address)
        template_name = 'address_edit.html'
        context = {
            'form': form,
            'Address': address,
        }
        return render(request, template_name, context)

    注意:如果 POST 请求成功,您应该发送redirect [Django-doc] 实施Post/Redirect/Get pattern [wiki]。 这样可以避免在用户刷新时发出相同的 POST 请求 浏览器。


    注意:最好使用@login_required decorator [Django-doc] 作为装饰器,因此将函数包装在其中:

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def edit_address(request, id):
        # …

    注意:您应该不要创建一个新的表单,以防表单无效。表单 无效的会将输入的问题存储在 form.errors 字典,如果您呈现表单(自动), 它会在出现这些错误的字段旁边显示错误。

    【讨论】:

    • 在 html 中除了标题没有显示任何内容
    • 您需要使用{{ form }}呈现表单。
    • 添加了html文件
    • @Shreyash:如果你改用{{ form }} 会发生什么,只是为了消除这与渲染表单有关的可能性。
    • {% for Address in address %} 似乎也没有多大意义。您实际上可以消除循环(不是循环的body,而是循环机制本身)。
    猜你喜欢
    • 2019-12-02
    • 1970-01-01
    • 2014-06-02
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2018-10-12
    • 2019-10-10
    相关资源
    最近更新 更多