Проверка уникальных полей в Django - PullRequest
4 голосов
/ 17 апреля 2011

Я не знаю, правильно ли я подхожу к проблеме. Предполагаемый результат - иметь форму, отображающую только name и description. Как только пользователь отправляет форму, я хочу добавить текущего пользователя как owner и проверить, есть ли уже запись с такими же name и user. Если есть, я хочу вернуть форму с ошибками. Если нет, я хочу сохранить Status.

Моя модель:

class Status(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField(blank=True)
    owner = models.ForeignKey(User)
    active = models.BooleanField(default=True)

    class Meta:
        unique_together = ('name','owner')

My View:

def settings_status(request):
    status_form = StatusForm()

    if request.method == 'POST':
        status_form = StatusForm(request.POST)
            if status_form.is_valid():
                new_status = Status()
                new_status.name = status_form.cleaned_data['name']
                new_status.description = status_form.cleaned_data['description']
                new_status.owner = request.user
                new_status.save()

    return render_to_response('base/settings_status.html',{
        'status_form'           :       status_form,
}, context_instance=RequestContext(request))

Я пробовал множество вещей, но продолжаю сталкиваться с проблемой, что, если я добавлю owner к объекту отдельно, он не будет доступен для функции clean модели и, следовательно, не может использоваться для проверки, если name и owner являются уникальными.

1 Ответ

5 голосов
/ 17 апреля 2011

Несколько способов сделать это:

например, передавая пользователя (владельца) в форму:

forms.py:

class StatusForm(forms.Form):
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user','')
        super(StatusForm, self).__init__(*args, **kwargs)
        self.fields['name'] = forms.CharField(label='Name')
        self.fields['description'] = CharField(label='Description', widget=forms.Textarea)

    def clean(self):
        cleaned_data = self.cleaned_data
        name = cleaned_data.get('name')

        if Status.objects.filter(name=name, owner=self.user).exists():
            self._errors['name'] self.error_class(['Status with this name exists'])  

        return cleaned_data

просмотров.py:

def settings_status(request):

    if request.method == 'POST':
        status_form = StatusForm(request.POST, user=request.user)
            if status_form.is_valid():
                new_status = Status()
                new_status.name = status_form.cleaned_data['name']
                new_status.description = status_form.cleaned_data['description']
                new_status.owner = request.user
                new_status.save()
    else:
        status_form = StatusForm(user=request.user)

    context = {'status_form':status_form,}

    return render_to_response('base/settings_status.html', context,
                context_instance=RequestContext(request))

Также посмотрите на настройку исходных данных в зависимости от настроек вашей формы и рассмотрите возможность использования ModelForm.

...