2015-03-09 3 views
1

Я хочу получить request в качестве параметра в save() метод.django переопределить модель save() метод

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() 

Вместо VALU e 2 Я хочу передать request.user. Как мне это сделать. Если вопрос неверен, пожалуйста, исправьте вопрос.

ответ

7

Не делайте этого в модели. Сделайте это в представлении.

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

Как говорит Даниил, не создает зависимости или вставить логику просмотра в вашу модель, представление должно быть достаточным для обработки вашего дела. – petkostas

+0

@ daniel roseman. Если вы не возражаете, не могли бы вы рассказать, проблема в том, что если использовать это в модели .. – Thameem

+0

thanks @petkostas – Thameem

1

Вы можете использовать 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 

В вас случае, передать запрос в качестве ключевого слова аргумент, а затем использовать его в модели сохранить() метод.

+0

спасибо за помощь – Thameem

+0

ваш метод не работает .Здесь я использую ModelForm .. – Thameem

5

Один из способов заключается в использовании 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) 
+1

благодарит за помощь – Thameem

+1

Мне это нравится - Спасибо ruddra –

Смежные вопросы