Django html href query last object pass id to url tag

mbyulnm0  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(134)

我有一个按钮,在我的基本模板,需要直接到一个形式,以编辑我的模型中的最后一个对象。
产品型号:

class Cast(models.Model):
    id = models.AutoField(db_column='Id')
    startdate = models.DateTimeField(db_column='StartDate')
    enddate = models.DateTimeField(db_column='EndDate')

检视:

def castend(request, id):
    context ={}
    obj = get_object_or_404(Cast, id = id)
    form = EndCastForm(request.POST or None, instance = obj)
    if request.method == 'POST':
        cast=Cast.objects.last()
        if form.is_valid():
            form.save()
            cast.refresh_from_db()
            cast.endcastcal()
            cast.save()
            return HttpResponseRedirect("/wwdb/casts/%i/castenddetail" % cast.pk)
    context["form"] = form
    return render(request, "wwdb/casts/castend.html", context)

URL

path('casts/<id>/castend/', views.castend, name='castend'),

base.py 此if/else语句确定是否填充了enddate字段,并将StartCast按钮传递给视图。否则,End Cast按钮将传递到视图。End Cast按钮需要一个传递给url的id参数。

<div class="top-button-container stickey-top">
        {% if cast.objects.last.enddate %}
            <button type="button" class="btn btn-danger btn-lg btn-block">
                <a class="nav-link" href="{% url 'caststart' %}">Start Cast</a>
            </button>
        {% else %}
            <button type="button" class="btn btn-danger btn-lg btn-block">
                <a class="nav-link" href="{% url 'castend' %}">End Cast</a>
            </button>
        {% endif %}
    </div>

开始转换表单这个表单是用户输入条目的大部分信息的方式。表单提交后,视图重定向到endcast表单,使用cast对象将主键传递给url。我希望我的www.example.com模板中的按钮base.py在此视图中操作HttpResponseRedirect函数。

def caststart(request):
    context ={}
    form = StartCastForm(request.POST or None)
    if request.method == "POST":
        form = StartCastForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            castid=Cast.objects.last()
            return HttpResponseRedirect("%i/castend" % castid.pk)
    else:
        form = StartCastForm 
        if 'submitted' in request.GET:
            submitted = True
            return render(request, 'wwdb/casts/caststart.html', {'form':form, 'submitted':submitted, 'id':id})

    context['form']= form

    return render(request, "wwdb/casts/caststart.html", context)

如何将强制转换模型中最后一个对象的pk传递给hrefurl标记?
我在网上四处打听,但没有想出一个解决方案,使这一工作的模板。

qpgpyjmq

qpgpyjmq1#

我们可以存储最后一个对象,然后在URL中使用它:

<div class="top-button-container stickey-top">
  {% with last=cast.objects.last %}
    {% if last.enddate %}
      <button type="button" class="btn btn-danger btn-lg btn-block"><a class="nav-link" href="{% url 'caststart' %}">Start Cast</a>
       </button>
    {% else %}
      <button type="button" class="btn btn-danger btn-lg btn-block">
                <a class="nav-link" href="{% url 'castend' last.pk %}">End Cast</a></button>
    {% endif %}
  {% endwith}
</div>

但这一切看起来糟糕的代码设计:在模板中创建自定义查询并在模板中编写业务逻辑通常不是一个好主意。
如何将强制转换模型中最后一个对象的pk传递给hrefurl标记?
是的,这就是棘手的地方。我不会那样做的我们可以在这里分开关注。我们可以创建两个视图,一个重定向到最新的项目,另一个然后创建一个表单来编辑任意的id,所以:

urlpatterns = [
    # …
    path('casts/end/', views.cast_end, name='cast-end'),
    path('casts/<int:id>/edit/', views.cast_edit, name='cast-edit'),
    # …
]

cast_end的简单视图:

from django.shortcuts import redirect

def cast_end(request):
    last = Cast.objects.latest('pk')
    return redirect('cast-edit', id=last.pk)

所以视图本身会重定向到插入最新的对象。
那么模板就是:

<a href="{% url 'cast-end' %}">

相关问题