Django: переопределение сохранения формы - PullRequest
3 голосов
/ 23 марта 2011

Моя форма:

class AssessmentForm(ModelForm):

    def save(self, commit=True, request=None, *args, **kwargs):

        print 'request.user.id:',request.user.id

        instance = super(AssessmentForm, self).save(commit=False)
        if commit:
            instance.save(request=request)
        if request:
            instance.modifier = request.user
            instance.save(request=request)
        return instance

    class Meta:
        model = Assessment

Моя модель класса

class Assessment(models.Model):
    name = models.CharField(max_length=255, verbose_name="Title")
    review_state = models.CharField(max_length=20,
                                    choices=REVIEW_STATE_CHOICES)
    iteration = models.IntegerField(choices=ITERATION_CHOICES)
    assessment_note = models.TextField(verbose_name="Notes",
                                       blank=True,
                                       null=True)
    .... snip ....
    modifier = models.ForeignKey(User,
                    editable=False,
                    related_name="%(app_label)s_%(class)s_modifier_related")
    modified = models.DateField(editable=False)


    def save(self, request=None, *args, **kwargs):
        if request:
            user = request.user
        else:
            user = User.objects.get(pk=1)
        self.modifier = user
        self.modified = datetime.now()

        if not self.id:
            self.creator = user
            self.created = datetime.now()
        super(Assessment, self).save(*args, **kwargs)

Когда я сохраняю форму, в базе данных поле modified имеет идентификатор 1, а не идентификатор 5, который является идентификатором текущего пользователя в пользовательской таблице. Таким образом, метод сохранения в модели не получает request, но запрос передается методу сохранения формы, который я протестировал .... вывод инструкции print в методе сохранения формы:

request.user.id: 5

Обновлено *

В class AssessmentForm(ModelForm) Я тоже пробовал:

def save(self, commit=True, request=None, *args, **kwargs):
    print 'request.user.id:',request.user.id
    instance = super(AssessmentForm, self).save(commit=False)
    if commit:
        instance.save(request=request)
    return instance

Обновлено 2 ** Я просто поместил несколько операторов print в метод сохранения модели и обнаружил, что к нему обращаются 3 раза. 1-й и 2-й вызов содержат запрос, а третий - нет. Таким образом, 1-й 2-кратный правильный идентификатор пользователя сохраняется, а 3-й вызов стирает его снова. Я понимаю, почему на него поступают 2 звонка, но почему идет третий звонок?

Что я здесь не так делаю?

Thx

Ответы [ 2 ]

7 голосов
/ 23 марта 2011

вы не передаете объект request в instance.save()

2 голосов
/ 23 марта 2011

Я думаю, потому что вы делаете 2 неправильные вещи,

1 - вы ожидаете получить запрос на метод сохранения модели

2 - вы делаете (более или менее) то же самоевещи в двух разных методах сохранения (форма и модель).

Теперь вы делаете что-то в форме сохранения, а затем переопределяете это в методе сохранения модели.

Мое общее предложение - отказатьсяс запросом и сохранением модели.

ИМХО лучше проводить такую ​​проверку / проверку на уровне формы или представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...