编辑 Django 表单中的现有条目

Posted

技术标签:

【中文标题】编辑 Django 表单中的现有条目【英文标题】:Editing existing entries in Django forms 【发布时间】:2014-07-29 08:16:06 【问题描述】:

我的问题类似于how to edit model data using django forms,但我无法解决。 我想获得一个带有预填字段的表单并允许用户编辑它们。 我相信我的问题出在 views.py 文件中,但不幸的是我无法解决它。

models.py

from django.db import models

class Item(models.Model):
    product = models.CharField(max_length=150)
    quantity = models.DecimalField(max_digits=8, decimal_places=3)
    price = models.DecimalField(max_digits=7, decimal_places=2)
    purchase_date = models.DateTimeField()
    warranty = models.DecimalField(max_digits=4, decimal_places=1)
    comment = models.TextField()

forms.py

from django import forms 
from items.models import Item

class EditItemForm(forms.ModelForm):
    class Meta:
        model = Item
        fields = ('product','quantity', 'price', 'purchase_date', 'warranty', 'comment')

urls.py

from django.conf.urls import patterns, include, url 

urlpatterns = patterns('',
    url(r'^show_all/$', 'items.views.items'),
    url(r'^(?P<item_id>\d+)/$', 'items.views.item'),
    url(r'^edit/(?P<item_id>\d+)/$', 'items.views.edit'),
)

edit.html

<form action="/items/edit/" method="post" class="form horizontal well">% csrf_token %
     form.as_p 
    <imput type="submit" class="btn btn-inverse" value="Aktualizuj">
</form>

views.py

from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from items.models import Item
from decimal import Decimal
from django.core.context_processors import csrf
from items.forms import EditItemForm
def edit(request):
    if request.method == 'POST':
        form = EditItemForm(request.POST, instance=request.item)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/items/show_all/')

    else:
        form = EditItemForm(instance=item)

    args = 
    args.update(csrf(request))
    args['form'] = form

    return render_to_response('edit.html', args)

上面的代码产生了这条消息:

/items/edit/1/ 处的类型错误

edit() 得到了一个意外的关键字参数“item_id”

你能帮帮我吗?

Django 1.6、Python 3.4

【问题讨论】:

【参考方案1】:

您已经想象了一个名为request.item 的属性。没有这样的事情。您需要通过传递给函数的 ID 从数据库中获取项目,如 alecxe 所示。

def edit(request, item_id):
    item = Item.objects.get(pk=item_id)
    if request.method == 'POST':
        form = EditItemForm(request.POST, instance=item)

【讨论】:

还有一个问题。由于我正在传递“return render_to_response('edit.html', args)”这一事实,我的 edit.html 文件无法由
嗯,这应该很明显:将项目(或者更好的是,id)添加到args。但实际上,您甚至不需要这样做:您正在发布到 current URL,因此您只需执行action="."【参考方案2】:

edit() 视图应该允许关键字参数item_id:

def edit(request, item_id=None):
    if request.method == 'POST':
        ...

【讨论】:

是的,这解决了这个警告。但它仍然不起作用。我相信“实例”有问题。这些论点是否有任何预期的流动? @user3093247 好的,发生了什么? 我认为“实例”有问题。这些论点是否有任何预期的流动?

以上是关于编辑 Django 表单中的现有条目的主要内容,如果未能解决你的问题,请参考以下文章

Django 编辑表单数据:数据被复制而不是被更新

Django 表单 - 就地编辑来自反向外键连接的数据

用户同时编辑时,Django 内联表单集抛出 IndexError

Django中动态表单的任何现有解决方案?

从 Django 中的文本字段填充管理表单

django 通用(类)视图中的多个表单类