Django: Как мне включить имя пользователя в URL? - PullRequest
1 голос
/ 16 апреля 2019

Django2.1

Мое приложение хочет включить имя пользователя Twitter в URL, но возникает ошибка.Я могу правильно получить имя пользователя, но не могу правильно подключиться к URL.В чем причина?

При доступе к деталям возникает ошибка.

ValueError at /Temporary username/detail
invalid literal for int() with base 10: 'Temporary username'
#views.py
class MyDetailView(DetailView):
    model = Mymodel

class MyCreateView(LoginRequiredMixin, CreateView):
    model = Mymodel
    form_class = MyForm

    def form_valid(self, form):
        obj = form.save(commit=False)
        obj.user = self.request.user
        return super(MyCreateView, self).form_valid(form)

    def get_success_url(self):
        return reverse_lazy('detail', kwargs={"pk": self.request.user.username})
#urls.py
urlpatterns = [
    path('<slug:pk>/detail', MyDetailView.as_view(), name="detail"),
    path('create/', MyCreateView.as_view(), name="create"),
]

Спасибо

1 Ответ

0 голосов
/ 16 апреля 2019

По умолчанию 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})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...