你如何更改发送到 Django 更新视图的主键?
How do you change the primary key sent to an update view in django?
我想更改从模板发送到更新视图的主键。让我解释。这是我的模板:
<a href="{% url 'new_url' model_instance.pk %}">
{{ model_instance.username }}
</a>
此 model_instance
是列表视图中上下文变量 model_instances
的 for 循环中的一个实例。 model_instance 的主键将被发送到以下视图:
class UserUpdateView(generic.UpdateView):
template_name = "leads/update.html"
queryset = User.objects.all()
context_object_name = "user"
form_class = UserUpdateForm
def get_success_url(self):
return reverse("some-url")
但是,问题是我发送给 UserUpdateView
的主键是 model_instance
模型的主键,而不是 User
模型的主键。此外,两个模型之间没有 link 这样的一对一关系。但是,有一个相似之处。 model_instance
和 user
都有一个相同的 username
字段。
换句话说,我需要先检索model_instance.username
,然后查询User
模型以找到与我想要的username
相同的user
实例更新。目前,UserUpdateView
只是接收模板中 model_instance
的主键,这不是我想要的。我希望你们能帮助我解决这个问题,请留下任何问题。谢谢。
它不够直观,但它是可能的。还值得一提的是,您在视图中定义了一个 queryset
属性,如果您只想更新一个对象,则没有必要。
您可以覆盖 get_object
方法来执行此操作:
class UserUpdateView(generic.UpdateView):
template_name = "leads/update.html"
# queryset = User.objects.all()
context_object_name = "user"
form_class = UserUpdateForm
def get_success_url(self):
return reverse("some-url")
def get_object(self):
# Here w'll retrieve the correct object to update
# First we retrieve the username of the model_instance
model_instance = ModelInstance.objects.get(pk=self.kwargs['pk'])
username = model_instance.username # Retrieve the username
# After, retrieve the user with username=model_instance.username
# Normally, the username must be unique per model_instance and per user. If not an error can be trowed.
user = User.objects.get(username=username)
# If username is not unique, try this approach
# user = User.objects.filter(username=username).first()
# Return the user object
return user
此模板link:
<a href="{% url 'new_url' model_instance.pk %}">
{{ model_instance.username }}
</a>
现在会指出用户更新,而不是model_instance。
更多关于get_object
由于 model_instance 和用户具有相同的用户名,您可以在生成 url 时传入 model_instance.username
并更改您的 UpdateView 以指定 slug_field = "username"
。您还必须更改 urlconfig 以使用“slug”而不是“pk”或添加 slug_url_kwarg = "pk"
.
<a href="{% url 'new_url' model_instance.username %}">
{{ model_instance.username }}
</a>
class UserUpdateView(generic.UpdateView):
template_name = "leads/update.html"
queryset = User.objects.all()
context_object_name = "user"
form_class = UserUpdateForm
slug_field = "username"
slug_url_kwarg = "pk"
def get_success_url(self):
return reverse("some-url")
我想更改从模板发送到更新视图的主键。让我解释。这是我的模板:
<a href="{% url 'new_url' model_instance.pk %}">
{{ model_instance.username }}
</a>
此 model_instance
是列表视图中上下文变量 model_instances
的 for 循环中的一个实例。 model_instance 的主键将被发送到以下视图:
class UserUpdateView(generic.UpdateView):
template_name = "leads/update.html"
queryset = User.objects.all()
context_object_name = "user"
form_class = UserUpdateForm
def get_success_url(self):
return reverse("some-url")
但是,问题是我发送给 UserUpdateView
的主键是 model_instance
模型的主键,而不是 User
模型的主键。此外,两个模型之间没有 link 这样的一对一关系。但是,有一个相似之处。 model_instance
和 user
都有一个相同的 username
字段。
换句话说,我需要先检索model_instance.username
,然后查询User
模型以找到与我想要的username
相同的user
实例更新。目前,UserUpdateView
只是接收模板中 model_instance
的主键,这不是我想要的。我希望你们能帮助我解决这个问题,请留下任何问题。谢谢。
它不够直观,但它是可能的。还值得一提的是,您在视图中定义了一个 queryset
属性,如果您只想更新一个对象,则没有必要。
您可以覆盖 get_object
方法来执行此操作:
class UserUpdateView(generic.UpdateView):
template_name = "leads/update.html"
# queryset = User.objects.all()
context_object_name = "user"
form_class = UserUpdateForm
def get_success_url(self):
return reverse("some-url")
def get_object(self):
# Here w'll retrieve the correct object to update
# First we retrieve the username of the model_instance
model_instance = ModelInstance.objects.get(pk=self.kwargs['pk'])
username = model_instance.username # Retrieve the username
# After, retrieve the user with username=model_instance.username
# Normally, the username must be unique per model_instance and per user. If not an error can be trowed.
user = User.objects.get(username=username)
# If username is not unique, try this approach
# user = User.objects.filter(username=username).first()
# Return the user object
return user
此模板link:
<a href="{% url 'new_url' model_instance.pk %}">
{{ model_instance.username }}
</a>
现在会指出用户更新,而不是model_instance。
更多关于get_object
由于 model_instance 和用户具有相同的用户名,您可以在生成 url 时传入 model_instance.username
并更改您的 UpdateView 以指定 slug_field = "username"
。您还必须更改 urlconfig 以使用“slug”而不是“pk”或添加 slug_url_kwarg = "pk"
.
<a href="{% url 'new_url' model_instance.username %}">
{{ model_instance.username }}
</a>
class UserUpdateView(generic.UpdateView):
template_name = "leads/update.html"
queryset = User.objects.all()
context_object_name = "user"
form_class = UserUpdateForm
slug_field = "username"
slug_url_kwarg = "pk"
def get_success_url(self):
return reverse("some-url")