Почему self.instance не установлен в чистой функции для связанной формы? - PullRequest
1 голос
/ 26 октября 2010

У меня есть модель Django 1.1 с уникальным_только на владельца и заголовком, где владелец является внешним ключом для пользователя.Это ограничение применяется, но только после очистки.Согласно Django docs , я должен иметь возможность доступа к self.instance, чтобы увидеть свойства объекта неформального поля экземпляра модели.

Однако я получаю ошибку

Объект 'JournalForm' не имеет атрибута 'instance'

Почему self.instance не устанавливается в этой связанной форме ни в методах формы clean (), ни в поле clean_title ()?

Моя модель:

class Journal (models.Model):
    owner = models.ForeignKey(User, null=True, related_name='journals')
    title = models.CharField(null=False, max_length=256)
    published = models.BooleanField(default=False)

    class Meta:
        unique_together = ("owner", "title")

    def __unicode__(self):
        return self.title

Моя форма:

class JournalForm (forms.Form):
    title = forms.CharField(max_length=256,
                                label=u'Title:')
    html_input = forms.CharField(widget=TinyMCE(attrs={'cols':'85', 'rows':'40'}, ), 
                            label=u'Journal Content:')
    published = forms.BooleanField(required=False)

    def clean(self):
        super(JournalForm, self).clean()
        instance = self.instance
        return self.cleaned_input

    def clean_title(self):
        title = self.cleaned_data['title']
        if self.is_bound:
            if models.Journal.objects.filter(owner.id=self.instance.owner.id, title=title).exclude(id=self.instance.id).count() > 0:
               raise forms.ValidationError(u'You already have a Journal with that title. Please change your title so it is unique.')
        else:
            if models.LabJournal.objects.filter(owner.id=self.instance.owner.id, title=title).count() > 0:
               raise forms.ValidationError(u'You already have a Journal with that title. Please change your title so it is unique.')
        return title

По запросу - код вида:

def journal (request):
    try:
        journal = models.Journal.objects.get(id=id)
        if request.method == 'GET':
            if request.user.is_active:
                if request.user.id == journal.owner.id:
                    data = {
                        'title' : journal.title,
                        'html_input' : _journal_fields_to_HTML(journal.id),
                        'published' : journal.published
                    }
                    form = forms.JournalForm(initial=data)
                    return shortcuts.render_to_response('journal/Journal.html', { 'form':form, })
                else:
                    return http.HttpResponseForbidden('<h1>Access denied</h1>')
            else:
                return _display_login_form(request)
        elif request.method == 'POST':
            if LOGIN_FORM_KEY in request.POST:
                return _handle_login(request)
            elif request.user.is_active and request.user.id == journal.owner.id:
                form = forms.JournalForm(data=request.POST)
                if form.is_valid():
                    journal.title = form.cleaned_data['title']
                    journal.published = form.cleaned_data['title'];
                    journal.save()
                    if _HTML_to_journal_fields(journal, form.cleaned_data['html_input']):
                        html_memo = "Save successful."
                    else:
                        html_memo = "Unable to save Journal."
                    return shortcuts.render_to_response('journal/Journal.html', { 'form':form, 'saved':html_memo})
                else:
                    return shortcuts.render_to_response('journal/Journal.html', { 'form':form })
        return http.HttpResponseNotAllowed(['GET', 'POST'])
    except models.Journal.DoesNotExist:
        return http.HttpResponseNotFound('<h1>Requested journal not found</h1>')

1 Ответ

3 голосов
/ 26 октября 2010

Ну, здесь есть пара вопросов.

Во-первых, вы не используете ModelForm. Документы, на которые вы ссылаетесь, предназначены для тех, а не для стандартных форм.

Во-вторых, для того чтобы форма имела атрибут экземпляра, вам нужно передать этот экземпляр при создании экземпляра формы.

Если вы используете ModelForm, вам не понадобится код, который преобразует поля журнала в поля формы, и наоборот при сохранении - форма сделает это за вас. Вы также сможете удалить метод clean_title, который проверяет уникальность, поскольку он уже определен ограничением unique_together для модели, и ModelForm обеспечит его для вас.

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