2017-02-04 3 views
0

Отказ от ответственности: Все еще очень новый.Django Modelform Перенаправление на представленный формы

Мне удалось завести сайт и запустить каталоги скалолазания. У меня есть функциональная форма, которая позволяет пользователям отправлять новый элемент в каталог, но не смогли определить, как перенаправить их на вновь созданную страницу. Вот мой код:

(«...» вместо того, что я думаю, что не имеет никакого отношения и громоздкий код Дайте мне знать, если вам это нужно.!)

forms.py:

class PostForm(forms.ModelForm): 
    class Meta: 
     model = MyDB 
     fields = (...) 
    def save(self): 
     instance = super(PostForm, self).save(commit=False) 
     instance.slug = slugify (instance.name) 
     instance.save() 

     return instance 

views.py:

def post_new(request): 
    things = MyDB.objects.order_by('name') 
    if request.method == "POST": 
     form = PostForm(request.POST) 
     if form.is_valid(): 
      created_at = timezone.now() 
      updated_at = timezone.now() 
      form.save() 
      return render(request, 'DB.html', { 
       'things': things, 
      }) 
    else: 
     form = PostForm() 
    return render(request, 'things/submit_thing.html', {'form': form}) 

models.py:

from django.db import models 

class MyDB(models.Model): 
    ... 
    slug = models.SlugField(unique=True) 

и urls.py:

url(r'^things/(?P<slug>[-\w]+)/$', views.thing_detail, name='thing_detail'), 
url(r'^post/new/$', views.post_new, name='post_new'), 

Прямо сейчас я Просто он перенаправляет на статический HTML-страницу, потому что я не могу понять, как заставить его загрузить вновь созданную страницу. Я попытался использовать функцию перенаправления, но не знаю, как назначить вновь созданную страницу в качестве адресата.

Спасибо!

Edit: Вот рабочий код:

from django.shortcuts import render, redirect, reverse 

def post_new(request): 
    things = MyDB.objects.order_by('name') 
    if request.method == "POST": 
     form = PostForm(request.POST) 
     if form.is_valid(): 
      created_at = timezone.now() 
      updated_at = timezone.now() 
      thing = form.save()  
      return redirect(reverse('thing_detail', kwargs={'slug': thing.slug}) 
      ) 
    else: 
     form = PostForm() 
    return render(request, 'things/submit_thing.html', {'form': form}) 
+0

Адрес, куда вы хотите перенаправить пользователя. – arcegk

+0

К удаленной версии поля «имя». Например, если они отправили форму с именем «Боб замечательно», она перенаправила бы на/things/bob-is-great /, который является сгенерированным представлением только что представленных данных. – Josh

+0

Назначить результат формы. save() 'к переменной, например 'instance = form.save()'. Затем вы можете использовать 'instance.slug'. – Alasdair

ответ

0

От docs

Вы можете использовать функцию redirect быстрого и reverse для обратного разрешения имени, в вашем случае:

thing = form.save()  
redirect(reverse('thing_detail', kwargs={'slug': thing.slug)) 
+0

Пробовал подключить это к моему коду, а также добавить его в импорт в заголовке, но мне не очень повезло. Получение объекта «QuerySet» не имеет ошибки атрибута «slug». Я обновил исходный пост с помощью моего обновленного кода. – Josh

+0

@Josh С 'thing' я имел в виду экземпляр' MyDB', см. Edit – arcegk

+0

Примечание: вам не нужно ' reverse 'с 'redirect' -' redirect (' thing_detail ', slug = thing.slug) 'делает то же самое, что и' redirect (reverse (' thing_detail ', kwargs = {' slug ': thing.slug)). – Alasdair