Как отобразить DetailView в Django?

Помогите пожалуйста вывести страницу с объектом модели.
Модель описана так
class Patient(models.Model):
    # uuid = ShortUUIDField()
    firstname = models.CharField(max_length=100, verbose_name="Имя", blank=False, null=True)
    lastname = models.CharField(max_length=300, verbose_name="Фамилия", blank=False, null=True)
    upload_path = 'patient/'
    photo = models.ImageField(upload_to=upload_path, verbose_name="Фото профиля", null=True)
    MAN = 'M'
    FEMALE = 'F'
    GENDER_CHOICES = (
        (MAN, 'Мужской'),
        (FEMALE, 'Женский'),
    )
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES, default=MAN, verbose_name="Пол",)
    midle_name = models.CharField(max_length=300, verbose_name="Отчетство", blank=True, null=True)
    birthday = models.DateField(verbose_name="Дата рождения")
    phone = models.CharField(max_length=20, verbose_name="Номер телефона")
    email = models.EmailField(max_length=200, verbose_name="Электронный адрес")

    class Meta:
        verbose_name = 'Пациент'
        verbose_name_plural = 'Пациенты'

    def __str__(self):
        return "%s %s" % (self.firstname, self.lastname)


Далее создал класс во вьюхе:
class PatientDetailView(DetailView):
	model = Patient
	queryset = Patient.objects.filter(id=1)

	def get_context_data(self, **kwargs):
		context = super(PatientDetailView, self).get_context_data(**kwargs)
		context['patient'] = Patient.objects.get(id=id)
		return context


ну и urls на последок
url(r'^(?P<id>[0-9]+)/$', views.PatientDetailView.as_view(), name='patient_detail'),


При попытке открыть страницу записи 127.0.0.1:8000/patient/1
выдается ошибка
Generic detail view PatientDetailView must be called with either an object pk or a slug.
Суть оишбки понял, как устранить нет. У меня в модели нет ни slug ни pk.
  • Вопрос задан
  • 7298 просмотров
Решения вопроса 1
crazyzubr
@crazyzubr
Python backend-developer
Что значит нет pk, это и есть id.

Нужно просто поменять атрибут у класса вьюхи pk_url_kwarg = 'id', либо в urls.py поменять паттерн на r'^(?P<pk>[0-9]+)/$' вместо r'^(?P<id>[0-9]+)/$'

Пример:
class PatientDetailView(DetailView):
  model = Patient
  pk_url_kwarg = 'id'
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
DmitryVoronkov
@DmitryVoronkov
Python Developer
Удали это. тебе не нужно самому прописывать айди. Посмотри исходник DetailView
queryset = Patient.objects.filter(id=1)

  def get_context_data(self, **kwargs):
    context = super(PatientDetailView, self).get_context_data(**kwargs)
    context['patient'] = Patient.objects.get(id=id)
    return context
Ответ написан
Комментировать
fox_12
@fox_12 Куратор тега Django
Расставляю биты, управляю заряженными частицами
Что-то сильно сложно вы накрутили...
Помимо описания модели, в urls.py нужно прописать что-то вроде:

from .views import PatientDetailView
...
    url(r'patient/(?P<pk>\d+)/', PatientDetailView.as_view(), name='patient_detail'),
...


в views.py
from django.views.generic import DetailView
from models import Patient

class PatientDetailView(DetailView):
    model = Patient

И все... - экземпляр вашей модели с pk=1 при входе на /patient/1/ будет улетать в контекст темплейта patient_detail.html в виде переменной object

А можно еще проще, просто прописав в urls.py:

from django.views.generic import DetailView
from .models import Patient

urlpatterns = [
    ...
    url(r'patient/(?P<pk>\d+)/', DetailView.as_view(model=Patient), name='patient_detail'),
]

А конкретно у вас ошибка из-за того, что вы используете id в url вместо pk
Ответ написан
Комментировать
Добавлю, если Вам нужно получить объект каким то хитрым способом, то лучше все же использовать get_object
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы