【问题标题】:django override model save() methoddjango 覆盖模型 save() 方法
【发布时间】:2015-03-09 11:49:29
【问题描述】:

我想在save() 方法中获取request 作为参数。

models.py

class Profile(models.Model):
    uuid = UUIDField(auto=True)
    user = models.ForeignKey(User)
    name = models.CharField(max_length=128)
    dob = models.DateField()

    class Meta:
        db_table = 'profile'

    def save(self,*args,**kwargs):
        if not self.pk:
            self.user_id = 2  #here i need request.user instead of 2
        super(Profile,self).save(*args,**kwargs)

forms.py

class ProfileForm(forms.ModelForm):

    class Meta:
        model = Profile
        exclude = ['uuid','user']

views.py

def add(request):
    profile_form = ProfileForm(request.POST)
    profile_form.save()

我想传递 request.user 而不是值 2。我该怎么做。如果问题不正确,请更正问题。

【问题讨论】:

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


    【解决方案1】:

    不要在模型中这样做。在视图中执行。

    profile_form = ProfileForm(request.POST)
    if profile_form.is_valid():
        profile = profile_form.save(commit=False)
        profile.user = request.user
        profile.save()
    

    【讨论】:

    • 正如丹尼尔所说,不要在模型中创建依赖关系或插入视图逻辑,视图应该足以处理您的情况。
    • @daniel Roseman。如果您不介意,请告诉我,如果在模型中使用它会产生问题..
    • 因为模型不应该对请求一无所知。一方面,您可能完全从请求周期之外调用模型;在异步 Celery 任务、manage.py 命令或类似的任何东西中。
    【解决方案2】:

    一种方法是使用crequest,像这样:

    # model
    from crequest.middleware import CrequestMiddleware
    
    class Profile(models.Model):
        # Some fields
        def save(self, *args, **kwargs):
            crequest = CrequestMiddleware.get_request() #its the current request
            if crequest.user.pk is 1:
                # Do stuff
               pass
        super(Profile,self).save(*args,**kwargs)
    

    【讨论】:

      【解决方案3】:

      您可以使用 kwargs。 例如:

      views.py

      profile_form.save(your_arg = request)
      

      models.py

      your_var = kwargs.pop("your_arg", None) #Second argument of kwargs.pop is default value
      

      在你的情况下,将请求作为关键字参数传递,然后在模型的 save() 方法中使用它。

      【讨论】:

        猜你喜欢
        • 2021-11-21
        • 2012-02-21
        • 2011-09-28
        • 2019-06-10
        • 2021-04-10
        • 1970-01-01
        • 2020-06-14
        • 2018-10-12
        • 1970-01-01
        相关资源
        最近更新 更多