По умолчанию DetailView использует метод get_object () для извлечения объекта из набора запросов. get_object()
использует pk_url_kwarg . Это означает, что он ищет первичный ключ в URL с параметром URL pk
. Здесь вы отправляете имя пользователя как pk
, но в вашем классе Mymodel
первичный ключ - целое число id
. Вот почему происходит ошибка.
Таким образом, есть два возможных решения: одно - , вы можете изменить первичный ключ на username в Mymodel:
class Mymodel(models.Model): # Please use CamelCase when defining class name
username = models.CharField(max_length=255, unique=True, primary_key=True)
Другое решение - переопределить метод get_object
внутри MyDetailView
, чтобы получить объект:
Лучше переименовать параметр url чем-либо, кроме pk
, потому что имя пользователя не ваше pk
. Вы можете сделать это так:
# view
class MyDetailView(DetailView):
model = Mymodel
def get_object(self):
return get_object_or_404(Mymodel, username=self.kwargs['username'])
# url
path('<str:username>/detail', MyDetailView.as_view(), name="detail"),
# get_success_url in MyCreateView
def get_success_url(self):
return reverse_lazy('detail', kwargs={"username": self.request.user.username})