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

Django:如何在url中包含用户名?,django,python-3.x,Django,Python 3.x,Django2.1 我的应用程序希望在url中包含twitter用户名,但出现错误。 我可以正确获取uesrname,但无法正确连接到url。 原因是什么 访问详细信息时出错 ValueError at /Temporary username/detail invalid literal for int() with base 10: 'Temporary username' #url.py URL模式=[ 路径('/detail',MyDetailView.as_view(),name=“d

Django2.1

我的应用程序希望在url中包含twitter用户名,但出现错误。 我可以正确获取uesrname,但无法正确连接到url。 原因是什么

访问详细信息时出错

ValueError at /Temporary username/detail
invalid literal for int() with base 10: 'Temporary username'
#url.py
URL模式=[
路径('/detail',MyDetailView.as_view(),name=“detail”),
路径('create/',MyCreateView.as_view(),name=“create”),
]

谢谢

默认情况下,DetailView使用方法从queryset获取对象<代码>获取对象()使用。这意味着它在url中使用url参数
pk
查找主键。在这里,您以
pk
的形式发送用户名,但在您的
Mymodel
类中,主键是integer
id
。这就是错误发生的原因

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

class Mymodel(models.Model):  # Please use CamelCase when defining class name
    username = models.CharField(max_length=255, unique=True, primary_key=True)
另一种解决方案是覆盖
MyDetailView
中的
get\u对象
方法以获取对象:

最好重命名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})
#查看
类MyDetailView(DetailView):
model=Mymodel
def get_对象(自身):
返回get_object_或_404(Mymodel,username=self.kwargs['username'])
#网址
路径('/detail',MyDetailView.as_view(),name=“detail”),
#在MyCreateView中获取\u成功\u url
def get_success_url(自我):
返回反向_lazy('detail',kwargs={“username”:self.request.user.username})

能否请您共享详细视图的代码?已更新。detailView中没有写任何东西,但在初始版本中效果很好。谢谢。我可以参考你的意见解决它。为我工作,但不需要“获取成功url”部分
class Mymodel(models.Model):  # Please use CamelCase when defining class name
    username = models.CharField(max_length=255, unique=True, primary_key=True)
# 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})