【问题标题】:Unable to get or create object within a form无法在表单中获取或创建对象
【发布时间】:2020-06-24 17:12:11
【问题描述】:

当使用表单创建另一个对象时,我正在尝试获取或创建一个对象:

def index(request, log_id, token):
log = get_object_or_404(LogBook, pk=log_id)
logmessages = LogMessage.objects.filter(logbook=log_id)
form = CreateLogMessage(request.POST)
if request.method == "POST":
    if form.is_valid():
        instance = form.save(commit=False)
        instance.reported_by = request.user
        instance.logbook = log
        instance.save()
        logdone = LogDone.objects.get_or_create(logmessage=logmessages, done_status=False)

我正在尝试找出一种方法来获取创建的日志消息的 id 以将其传递给我的 logdone 实例。

到目前为止我还没有找到方法,任何帮助将不胜感激。

【问题讨论】:

    标签: python python-3.x django django-views


    【解决方案1】:

    创建的对象是实例,因此您可以将其实现为:

    from django.shortcuts import redirect
    
    def index(request, log_id, token):
        log = get_object_or_404(LogBook, pk=log_id)
        if request.method == 'POST':
            form = CreateLogMessage(request.POST)
            if form.is_valid():
                form.instance.reported_by = request.user
                form.instance.logbook = log
                instance = form.save()
                logdone = LogDone.objects.get_or_create(
                    logmessage=instance,
                    done_status=False
                )
                return redirect('name-of-some-view')
        else:
            form = CreateLogMessage(request.POST)
            …

    由于您的表单每次都会创建一个 new 对象,因此 总是 创建一个对象。


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


    注意:您可以使用 @login_required decorator [Django-doc].

    【讨论】:

    • 一如既往地感谢您的明确回答和帮助我(和其他人)改进代码的提示,我将查看文档并改进整体脚本。
    猜你喜欢
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多