【问题标题】:Django displaying each object in a buttonDjango 在按钮中显示每个对象
【发布时间】:2022-01-25 19:41:23
【问题描述】:

美好的一天,我有一个页面可以测试创建票证的位置以及列出所有创建的票证(标题)的位置。现在您应该可以点击已创建工单的标题了。

然后按钮会重定向到一个额外的页面,其中包含特定票的所有信息。

我一直在显示用户特定的内容时遇到问题,那么需要做什么才能使每个链接的 href="" 在 HTML 中重定向到特定的票证?

我做了以下 \\forms.py

  {% for i in request.user.addtitle_set.all %}
  <div>
    {% if i.user == request.user %} {{ i.title }} {% endif %}
    <form action="{% url SOMETHING_HERE i.id}" style="display: inline">
      <button type="submit">View Ticket</button>
    </form>
  </div>
  <br />
  {% endfor %}

\\urls.py

    path('dashboard/user/ticket', ticket_view),
    path('dashboard/user/ticket/<int:id>/',
         ticket_system_view, name="view_ticket"),

\\models.py

class Ticket(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        default=None,
        null=True,
        on_delete=models.CASCADE,
    )
    title = models.CharField(max_length=200)
    description = models.TextField()
    creator_adress = models.GenericIPAddressField(null=True)
    start_date = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return str(self.title)

\\views.py

@login_required
def ticket_view(request, id, *args, **kwargs):

    try:
        obj = Ticket.objects.get(id=id)
    except Ticket.DoesNotExist:
        return redirect('/')

    if request.method == 'POST':
        form = TicketForm(request.POST, instance=Ticket(user=request.user))
        if form.is_valid():
            obj = form.save(commit=False)
            obj.creator_adress = get_client_ip(request)

            obj.save()
            return redirect('/dashboard/user/ticket')
    else:
        form = TicketForm()
    return render(request, 'ticket.html', {'form': form})


def ticket_system_view(request, id, *args, **kwargsw):
    # Here I will put all the stuff for the specific ticket page
    return render(request, 'ticket_system.html', {})

编辑: 由于错误,我什至无法访问该页面 /dashboard/user/ticket 处的类型错误

ticket_views() 缺少 1 个必需的位置参数:'id'

编辑 2.0: 解决方案:

    path('dashboard/user/ticket/', ticket_view),
    path('dashboard/user/ticket/<int:id>/',
         ticket_system_view, name="view_ticket"),
{% for i in request.user.ticket_set.all %}
<a href="{% url 'view_ticket' i.id %}"
  >{% if i.user == request.user %} {{ i.title }} {% endif %}</a
>
<br />
{% endfor %}

【问题讨论】:

    标签: python django


    【解决方案1】:

    你的 urls.py

    path('dashboard/user/ticket', ticket_view),
    path('dashboard/user/ticket/<int:id>/',
             ticket_system_view, name="view_ticket"),
    

    应该是

    path('dashboard/user/ticket/<int:id>', ticket_view, name="some_name"),
    path('dashboard/user/ticket/<int:id>/',
             ticket_system_view, name="view_ticket"),
    

    由于ticket_view 需要一个id

    【讨论】:

    • 这意味着我必须在 ticket_view 中的 URl 末尾有一些 ID。但是ticket_view应该只是一个创建ticket并显示所有ticket的页面。然后,ticket_system_view 用于显示每张门票的所有信息。因此,当我只想访问仪表板/用户/票证/ 时,我会收到 404 错误,因为 url 中没有票证 ID
    • 然后从 def ticket_view(.....) 中删除“id”
    • 那我要在Link的href=""里写什么呢?
    • 只需 {% url 'some_name' %}
    • 在您的 ticket_view 中,您可以显示每行的门票列表,并带有一个按钮/链接来选择它。该按钮有一个 href={% url "detail_view_name" id=ticket.id %} 指向带有 id 的详细信息页面
    【解决方案2】:
    ticket_views() missing 1 required positional argument: 'id'
    

    在您的views.py 中,您正在获取参数 id,因此必须传递它。 将您的urls.py 更改为

    path('dashboard/user/ticket/<int:pk>', ticket_view, name='ticket_view'),
    path('dashboard/user/ticket/<int:id>/',
             ticket_system_view, name="view_ticket"),
    

    还有你的 urlnamespace 在你的表单中

    <form action="{% url 'ticket_view' i.id %}" style="display: inline">
    

    在您的 url 模板标签中,% 前后必须有空格。您缺少结尾 % 也添加。

    【讨论】: