如何使用相同的 django 表单编辑/添加对象?

Posted

技术标签:

【中文标题】如何使用相同的 django 表单编辑/添加对象?【英文标题】:How to edit/add objects using the same django form? 【发布时间】:2011-01-24 13:16:11 【问题描述】:

嘿,我已经四处搜索来做到这一点(特别是这个 Q:Django edit form based on add form?),但我就是无法让它工作。

我遇到的问题是表单总是创建一个新对象,而不是修改现有对象。

这是我的代码:

def new_task(request, task_id=None):

if task_id is not None:
    task  = Task.objects.get(pk=task_id)
else:
    task = Task()

if request.method == 'POST': # If the form has been submitted...
    form = TaskForm(request.POST, instance=task)
    if form.is_valid():
        form.save();
        return tasks(request, 'Task #%s created successfully.' % (task.id))
else:
    form  = TaskForm(instance=task)

return custom_render('user/new_task.html',
                     'form': form,
                     request);

关于我缺少什么的任何线索?谢谢

编辑:添加表单定义。

class TaskForm(ModelForm):

description = CharField(max_length = 1500,
    widget= forms.Textarea(attrs='class':'task-description'),
    required=True)

class Meta:
    model = Task

【问题讨论】:

只是为了添加更多信息,编辑时表单会正确填充对象的数据,添加新表单时显示为空。除此问题外,一切正常。 您是否覆盖了表单保存方法?你能显示表单定义吗? 我刚刚添加了表单def。不,我没有覆盖保存方法... 很奇怪,这段代码应该没有这样的问题。你确定 task_id 不是 None 吗? 嗯,我很确定,因为表单中填充了来自该任务的数据......当我不那么累时我会看看这个,我会返回一些回答,我希望。 【参考方案1】:

好的,经过一个愉快的调试之夜,我发现了问题所在。其实很傻。 问题是提交时,task_id 为 None。

我通过以下方式解决了:

    在我添加的表格上:<form action="% url App.myapp.views.new_task **task_id** %"

    根据我的观点,我补充说:

    return custom_render('user/new_task.html', 'form': 表单, 'submit': 提交, 'task_id':task.id, 请求)

就是这样。新手误区。如果有人知道更好的方法,我愿意接受建议。

【讨论】:

Erm - 我认为如果您将 action 属性排除在外,那么它只会提交回相同的 URL,视图将获取 task_id 答案和您的评论都很有用。我同意你的评论最后所说的。

以上是关于如何使用相同的 django 表单编辑/添加对象?的主要内容,如果未能解决你的问题,请参考以下文章

Django - 禁用表单集中现有表单的编辑,但允许在新表单中编辑

如何从 Django 中的编辑表单更新对象?

django forms:在一个表单中编辑多组相关对象

如何在 Django 表单中添加新的相关对象

如何在 Django 中创建用于编辑的填充表单

Django将硬编码的href链接添加到管理模型的表单视图页面