Пустые cleaned_data - PullRequest
       17

Пустые cleaned_data

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

Я не понимаю, почему это происходит. Я применил точно такой же код к другим встроенным наборам форм, но этот конкретный встроенный набор форм не сохраняет никаких моих изменений. Я обнаружил, что в моей форме "AtLeastOneFull" этот form.cleaned_data всегда пуст, несмотря на то, что у меня есть данные.

На веб-странице правильно отображается содержимое модели «Доступ», но после нажатия кнопки «Отправить» она регистрируется как недействительная, поскольку у меня нет данных, независимо от того, какие изменения я внесу в данные встроенной формы на веб-странице.

формы:

class AtLeastOneFull(forms.models.BaseInlineFormSet):
    def clean(self):
        count = 0
        for form in self.forms:
            try:
                if form.cleaned_data and not form.cleaned_data.get('access_rights', ACCESS_CHOICES[0][0]):
                    count += 1
                    assert False
            except AttributeError:
                pass
        if count < 1:
            raise forms.ValidationError('You must have at least one full access user')

class UserAccessForm(forms.ModelForm):
    class Meta:
        model = Access
    def clean(self):
       cleaned_data = self.cleaned_data
       # Check 1: Must have valid user.
       # To Be Developed
       return cleaned_data

Модели:

class Portfolio (models.Model):
    nickname = models.CharField(max_length=20, unique=True)
    name = models.CharField(max_length=50, unique=True)
    address1 = models.CharField(max_length=75, null=True, blank=True) #Street address, P.O. box, company name, c/o
    address2 = models.CharField(max_length=75, null=True, blank=True) #Apartment, suite, unit, building, floor, etc.
    city = models.CharField(max_length=30, null=True, blank=True)
    state = models.CharField(max_length=2, null=True, blank=True)
    zip = models.CharField(max_length=10, null=True, blank=True)

    def __unicode__(self):
        return u'%s' % (self.nickname)

    class Meta:
        ordering = ['name']

# Property Expansion
class Access (models.Model):
    portfolio_id = models.ForeignKey(Portfolio)
    user_id = models.ForeignKey(User)
    title = models.CharField(max_length=30, null=True, blank=True)
    access_rights = models.PositiveIntegerField(choices=ACCESS_CHOICES)

    def __unicode__(self):
        return u'%s: %s' % (self.portfolio_id, self.user_id)

    class Meta:
        ordering = ['portfolio_id', 'user_id']
        unique_together = ("portfolio_id", "user_id")

вид:

cPortfolio = Portfolio.objects.get(nickname=pNickname)
AccessFormSet = inlineformset_factory(Portfolio,
                                      Access,
                                      form=UserAccessForm,
                                      formset=AtLeastOneFull,
                                      extra=1,
                                      can_delete=False)
if request.method == 'POST':
    if 'access_apply' in request.POST:
        cAccessFormSet = AccessFormSet(request.POST, request.FILES, instance=cPortfolio)
        if cAccessFormSet.is_valid():
            testResults  = cAccessFormSet.save(commit=False)
            for form in testResults:
                form.save()
cAccessFormSet = AccessFormSet(instance=cPortfolio)

Ответы [ 2 ]

0 голосов
/ 19 марта 2011

Проблема в чистоте функции формы.# To Be Developed был вставлен, чтобы сократить код для этого вопроса, но реальный код имел проблему, которая препятствовала возвращению данных.

class UserAccessForm(forms.ModelForm):
    class Meta:
        model = Access
    def clean(self):
       cleaned_data = self.cleaned_data
       # Check 1: Must have valid user.
       # To Be Developed
       return cleaned_data
0 голосов
/ 14 марта 2011

Конечно, это не так просто, как удалить оператор assert False в AtLeastOneFull.clean?

Кроме того, почему UserAccessForm.clean запрашивает User с "Username", если поле модели фактически user_id?

...