Django:如何在网址中包含用户名?

时间:2019-04-16 04:33:31

标签: django python-3.x

Django2.1

我的应用程序希望在URL中包含twitter用户名,但发生错误。 我可以正确获取uesrname,但是无法正确连接到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 :(得分:0)

默认情况下,DetailView使用get_object()方法从queryset获取对象。 get_object()使用pk_url_kwarg。这意味着它将在url参数为pk的url中查找主键。在这里,您将用户名发送为pk,但是在您的Mymodel类中,主键是整数id。这就是为什么发生错误。

因此有两种可能的解决方案,一种是,您可以在Mymodel中将主键更改为username:

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})