你如何更改发送到 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_instanceuser 都有一个相同的 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")