首页 > 解决方案 > Django 对象“锁定”和上下文渲染

问题描述

我有一个简单的(我认为)问题,关于 Django 上下文渲染。

我会直接进入它-

基本上我需要的是一些临时表,在我的例子中,我称之为 Locked。当用户按下一个按钮时,它是一个表单,该对象直接进入锁定表(只是一个简单的插入)。在该表内有一个名为 is_locked 的字段,如果它为 True,则该对象需要变为灰色,或者在 html 表内有一些锁定图标。

只是某种可见的标志,一个对象在表内被锁定,另一个用户不能访问它。

但是,我的问题是,因为在我的views.py 中,我的lock函数没有返回我想要呈现该储物柜图标的确切html,而是返回另一个html。

有什么方法可以在 2 个 html 页面上呈现相同的上下文?谢谢。

这是我的代码:

views.py


def lock(request, pk):
    # Linking by pk.
    opp = get_object_or_404(OpportunityList, pk=pk)
    opp_locked = get_object_or_404(Locked, pk=pk)
    # Taking two parametters for 2 fields.
    eluid = Elementiur.objects.get(eluid=pk)
    user = User.objects.get(username=request.user)

    # Dont bother with this one! Just pulling one field value.
    field_name = 'optika_korisnik'
    obj = OpportunityList.objects.get(pk=pk)
    field_object = OpportunityList._meta.get_field(field_name)
    field_value = getattr(obj, field_object.attname)

    # This is the main part! This is where i'm inserting data into Locked table.
    if opp_locked.DoesNotExist:
        opp_locked.id = int(eluid.eluid)
        opp_locked.locked_eluid = eluid
        opp_locked.locked_comment = field_value
        opp_locked.locked_user = user
        opp_locked.locked_name = 'Zaključao korisnik - ' + request.user.username
        opp_locked.is_locked = True
        opp_locked.save()
        # This is what has to be returned, but i need context on the other page.
        return render(request, 'opportunity/detalji/poziv.html',
                      {'opp': opp, 'locked': opp_locked})
    else:
        # This return has the context that i need(from the first opp_locked variable)
        return render(request, 'opportunity/opp_optika.html', {'locked_test': opp_locked})

我可以提供更多代码,但我认为这对于这类问题并不重要,因为所有逻辑都发生在lock函数内部,最后两个返回。

标签: djangodjango-modelsdjango-templatesdjango-viewsdjango-context

解决方案


如果这对您没有帮助,我只是对您的代码段进行了快速概述,抱歉,但您需要对其进行一些审查。

你调用DoesNotExist了一个 Locked 模型的实例, if opp_locked.DoesNotExist: [...] 这不是你应该使用这个异常的方式。

您有一个.exists()可用的方法,但仅适用于Querysets.

此外,如果您的实例不存在,您Http404在使用get_object_or_404()方法时已经返回响应。

也许您应该避免在实例之间共享主键并将它们替换为models.OneToOneFieldOneToOnefield


推荐阅读