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"),
]
谢谢
答案 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})