Проблема при добавлении в поле формы ManyToMany при очистке данных - PullRequest
2 голосов
/ 03 апреля 2011

Только что перешел с Django 1.00 на 1.30, и я неожиданно получаю сообщение об ошибке во время проверки формы:

AttributeError: 'QuerySet' object has no attribute 'append'

Код ниже.При очистке списка координаторов, указанных пользователем в форме, я хочу также включить всех суперпользователей.

Кажется, проблема в том, что вызов cleaned_data.get () возвращает QuerySet.Я думал, что он возвращает объект, представляющий тип поля.Как я уже говорил выше, этот код работал в версии 1.0, но, возможно, это был несчастный случай.

Может кто-нибудь сказать мне, что cleaned_data.get возвращает в этом случае и как я могу добавить к нему другие значения?

Спасибо.

class Party(models.Model):
    coordinators = models.ManyToManyField( 'PersonProfile', blank=True, related_name='event_coordinator_set', help_text='' )

class PartyForm(ModelForm):

    class Meta:
        model = Party

    def __init__( self, *args, **kwargs ):
        super( PartyForm, self ).__init__(*args, **kwargs)
        self.fields['coordinators'].queryset = PersonProfile.objects.exclude( user__is_superuser=1 )

    def clean_coordinators( self ):
        coordinators = self.cleaned_data.get( 'coordinators', '' )
        superuser_list = PersonProfile.objects.filter( user__is_superuser=1 )
        for superuser in superuser_list:
            coordinators.append( superuser )
        return coordinators

Ответы [ 2 ]

3 голосов
/ 03 апреля 2011

Как только вы узнали, что это QuerySet, вы могли бы просто превратить набор запросов в список и оставить оставшуюся часть кода без изменений ... coordinatiors = list(myqueryset), но я бы порекомендовал решение Тьерри.

Anyho, вы правы: я посмотрел на django 1.0, а ModelMultipleChoiceField использовал для возврата списка.Теперь он возвращает QuerySet.

Модель Django 1.0MultipleChoiceField.clean ()

final_values = []
for val in value:
    try:
        obj = self.queryset.get(pk=val)
    except self.queryset.model.DoesNotExist:
        raise ValidationError(self.error_messages['invalid_choice'] % val)
    else:
        final_values.append(obj)
return final_values

Модель Django 1.3MultipleChoiceField.clean ()

    for pk in value:
        try:
            self.queryset.filter(**{key: pk})
        except ValueError:
            raise ValidationError(self.error_messages['invalid_pk_value'] % pk)
    qs = self.queryset.filter(**{'%s__in' % key: value})
    pks = set([force_unicode(getattr(o, key)) for o in qs])
    for val in value:
        if force_unicode(val) not in pks:
            raise ValidationError(self.error_messages['invalid_choice'] % val)
    # Since this overrides the inherited ModelChoiceField.clean
    # we run custom validators here
    self.run_validators(value)
    return qs
3 голосов
/ 03 апреля 2011

Попробуйте следующее:

from django.db.models import Q

def clean_coordinators( self ):
    coordinators = self.cleaned_data.get( 'coordinators', '' )
    if coordinators:
        return PersonProfile.objects.filter(
            Q(pk__in=coordinators) | Q(user__is_superuser=1)
        )
    else:
        return PersonProfile.objects.filter(user__is_superuser=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...