2015-12-22 3 views
1

Я новичок в Django. Я создаю простое приложение, и у меня возникают трудности с созданием объекта с использованием представлений на основе классов. У меня есть модель:Django CreateView throws NoReverseMatch

models.py:

class Vehicle(models.Model): 
    make = ... 
    model = ... 

    def get_absolute_url(self): 
     return reverse('vehicle-detail', kwargs={'pk' : self.PK}) 

Тогда в views.py:

class VehicleCreate(CreateView): 
    model = Vehicle 
    fields = ['make','model'] 

MyApp urls.py

url(r'vehicle/add/$', VehicleCreate.as_view(), name='vehicle-add'), 

Все, что я написал выше относится только к CreateView. Все импортируется должным образом в соответствии с потребностями CreateView cbv. Когда я нахожусь в mydomain.com/vehicle/add/, есть форма со всеми полями модели, но когда я нажимаю кнопку Create, она выдает ошибку NoReverseMatch. Я пишу с моего телефона, и поэтому для меня немного сложно разместить полный файл .py-файлов.

+0

Исправьте отступы в коде. – Alasdair

+0

Вы указали URL-адрес «vehicle-add», чтобы понять, почему 'reverse ('vehicle-detail', ...)' не работает, нам нужно увидеть URL-адрес «автомобиль-деталь». – Alasdair

+0

Хм, у меня на самом деле нет указателя на автомобиль. Но это не упоминалось в документации. На что должен ссылаться этот url? Не могли бы вы дать мне более подробное объяснение? –

ответ

1

У вас есть метод get_absolute_url для вашей модели.

class Vehicle(models.Model): 

    def get_absolute_url(self): 
     return reverse('vehicle-detail', kwargs={'pk' : self.PK}) 

Для этого, чтобы работать, там должен быть шаблоном URL по имени vehicle-detail, который принимает первичный ключ в качестве ключевого слова аргумента.

Вы можете создать представление, используя DetailView.

class VehicleDetail(DetailView): 
    model = Vehicle 
    ...  

Вам нужно будет создать соответствующий шаблон.

Затем добавить шаблон URL-адрес что-то вроде:

url(r'vehicle/(?P<pk>\d+)/$', VehicleDetail.as_view(), name='vehicle-detail'), 
+0

Кажется, что я отсутствовал. Я не знал, что мне нужно иметь как CreateView, так и DetailView. Поэтому обратное должно перенаправить пользователя в DetailView - я прав? –

+0

Django имеет общие представления для создания ('CreateView'), чтения/просмотра (' DetailView'), обновления ('UpdateView') и удаления (' DeleteView'). По умолчанию ваш 'CreateView' перенаправляет URL-адрес нового объекта, но для этого вам нужно определить' get_absolute_url'. Обычно для 'get_absolute_url' имеет смысл использовать детальное представление для этой модели. – Alasdair

+0

Я понял это. Спасибо за помощь. –