【问题标题】:How do you change the primary key sent to an update view in django?如何更改发送到 django 更新视图的主键?
【发布时间】:2022-01-09 15:40:08
【问题描述】:

我想更改从模板发送到更新视图的主键。让我解释。这是我的模板:

<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 模型的主键。此外,两个模型之间没有像一对一关系那样的链接。但是,有相似之处。 model_instanceuser 都有一个相同的 username 字段。

换句话说,我需要先检索model_instance.username,然后查询User 模型以找到与我要更新的相同usernameuser 实例。目前,UserUpdateView 只是接收模板中model_instance 的主键,这不是我想要的。我希望你们能帮助我解决这个问题,并请留下您的任何问题。谢谢。

【问题讨论】:

    标签: django django-models django-views django-forms django-templates


    【解决方案1】:

    由于model_instance 和user 的用户名相同,您可以在生成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")
    

    【讨论】:

      【解决方案2】:

      它不够直观,但它是可能的。值得一提的是,您在视图中定义了 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
      

      此模板链接:

      <a href="{% url 'new_url' model_instance.pk %}">
          {{ model_instance.username }}
      </a>
      

      现在将指出要更新的用户,而不是 model_instance。

      更多关于get_object

      【讨论】:

      • 嘿,你是不是因为user = User.objects.get(username=username)而返回user?如果你定义为somethingelse = User.objects.get(username=username),那我应该返回somethignelse吗?
      • @code builder,当然是的
      猜你喜欢
      • 2015-06-21
      • 1970-01-01
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 2023-03-20
      • 2020-10-03
      相关资源
      最近更新 更多