URL-адреса и просмотры в DJANGO - PullRequest
0 голосов
/ 27 июня 2011

Я не уверен, как именно это сказать, но здесь идет. У меня есть несколько взглядов, к которым мой urls.py, кажется, вообще не подходит, и я не знаю почему. Я новичок в django и признаюсь, что немного озадачен тем, как это работает.

В моем шаблоне у меня есть:

<ul>
    <li><a href="/project/{{project.slug}}/tickets/create">Create Ticket</a></li>
    <li><a href="/project/{{ project.slug }}/tickets/edit">Edit Ticket</a></li>
    <li><a href="/project/{{ project.slug }}/tickets/delete">Delete Ticket</a></li>
</ul>

В моем urls.py:

(r'^ticket/(?P<ticket_id>\d+)$', views.editTicket),
(r'^(?P<project_slug>[^\.^/]+)/tickets/create$', views.createTicket),
(r'^(?P<project_slug>[^\.^/]+)/tickets/(?P<ticket_id>\d+)$', views.deleteTicket),

По моему views.py:

def createTicket(request, project_slug):
    project = Project.objects.get(slug=project_slug)
    form = None
    if request.method == 'POST':
        t = Ticket(created_by=request.user, assigned_to=request.user)
        form = TicketCreateForm(request.POST, instance=t)
        if form.is_valid():
            comment = Comment(user=request.user, body=request.POST.get("description", ""), subject="")
            comment.save()
            t.description = comment
            form.save()
            return HttpResponseRedirect("/project/ticket/%d" % t.pk)
    else:
        form = TicketCreateForm(instance=Ticket(project=project, assigned_to=request.user))
    payload = { 'project':project, 'form':form }
    return render(request, 'project/ticket_add.html', payload)

def editTicket(request, ticket_id):
    ticket = Ticket.objects.get(pk=ticket_id)
    if request.method == 'POST':
        form = TicketCreateForm(request.POST, instance=ticket)
        if form.is_valid():
            form.setComment(Comment(parent=ticket.description, user=request.user, body=request.POST.get("comment", " ")))
            form.save()
    form = TicketCreateForm(instance=ticket)
    payload = { 'project':ticket.project, 'ticket':ticket, 'ticket_form':form }
    return render(request, 'project/ticket.html', payload)

def deleteTicket(request, ticket_id):
    ticket = Ticket.objects.get(pk=ticket_id)
    ticket.delete()
    redirect_to = 'project/tickets.html'
    return HttpResponseRedirect(redirect_to)

def editTicket(request, ticket_id):
    ticket = Ticket.objects.get(pk=ticket_id) 
    if request.method == 'POST': 
        form = TicketCreateForm(request.POST, instance=ticket) 
        if form.is_valid(): 
            form.setComment(Comment(parent=ticket.description, user=request.user, body=request.POST.get("comment", " "))) 
            form.save()
    form = TicketCreateForm(instance=ticket) 
    payload = { 'project':ticket.project, 'ticket':ticket, 'ticket_form':form }
    return render(request, 'project/ticket.html', payload)

Что я здесь не так делаю? Кто-нибудь может помочь?

1 Ответ

1 голос
/ 27 июня 2011

Здесь есть несколько вопросов,

Во-первых, если вы не изменили соответствующие настройки, лучше всего добавить / в конце вашего URL, особенно если вы включаете $ в свои регулярные выражения URL, и django может перенаправить, чтобы добавить последний слеш к вашему адресу. .

Во-вторых, ваша deleteTicket функция принимает request и ticket_id в качестве аргументов, в то время как ей требуется 3 согласно вашему регулярному выражению, project_slug отсутствует.

3-й, <a href="/project/{{ project.slug }}/tickets/delete">Delete Ticket</a> просто не будет совпадать с (r'^(?P<project_slug>[^\.^/]+)/tickets/(?P<ticket_id>\d+)$', views.deleteTicket),, поскольку нет никаких признаков ticket_id.

В-четвертых (и не связано с проблемой соответствия), вы удаляете объект с помощью HTTP-запроса GET, что может быть не очень хорошей идеей (например, он может быть кэширован или поисковые системы могут попытаться поразить его). Также вызов Ticket.objects.get(pk=ticket_id) может вызвать исключение, попробуйте get_object_or_404(Ticket, pk=ticket_id), который, скорее всего, сделает то, что вы хотите. Это в from django.shortcuts import get_object_or_404.

Если это не сработает, попробуйте просмотреть исходный HTML-код, который отображается в шаблоне (со значениями, размещенными вместо {{project.slug}}), чтобы можно было провести дальнейшую проверку.

Надеюсь, это поможет вам.

...