2014-01-23 3 views
1

Представьте себе эту модельДжанго - форма проверки для перекрытия диапазоны дат

class Session(models.Model): 
    user = models.ForeignKey(User) 
    start_time = models.DateTimeField() 
    end_time = models.DateTimeField() 

Чтобы добавить/обновить сеанс, я использую этот ModelForm

class SessionForm(forms.ModelForm): 
    class Meta: 
     model = Session 
     fields = ('start_time', 'end_time',) 

Как мне нужно предотвратить session сек из того же user для перекрытия, я сделал эту форму чистой

def clean(self): 
    cleaned_data = super(SessionForm, self).clean() 
    start = cleaned_data.get('start_time') 
    end = cleaned_data.get('end_time') 
    conflicts = Session.objects.filter(
      start_time__lte=end, 
      end_time__gte=start, 
     ) 
    if any(conflicts): 
     raise forms.ValidationError(_("%i conflicts found" % conflicts.count())) 
    return cleaned_data 

Но, как я добавив user после save()

if form.is_valid(): 
    session = form.save(False) 
    session.user = request.user 
    session.save() 

Как я могу включить его в чеке конфликта?

Другими словами, как я могу передать user в качестве параметра clean()?

ответ

2

Существует альтернатива переопределению метода __init__. Передайте экземпляр session с набором user при создании формы.

session = Session(user=request.user) 
form = SessionForm(data=request.POST, instance=session) 
if form.is_valid(): 
    form.save() 

Затем в чистом методе, вы можете получить доступ к пользователю, как self.instance.user.

+0

Намного лучше для моего дела. Спасибо ! –

0

Вы должны переопределить __init__ для того, чтобы пройти user в форме

def __init__(self, *args, **kwargs): 
    self.user = kwargs.pop('user', None) 
    super(SessionForm, self).__init__(*args, **kwargs) 

И было бы также полезно, чтобы исключить pk, передавая его как парам, так session не может вступать в противоречие с сам.

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