Как обновить данные модели Django с помощью уникального ограничения, используя ModelForm? - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть две модели, одна из которых определена с ограничением (см. Модель «Сущности» ниже).

Я построил две формы, одну для создания новых данных модели, а другую для обновления данных модели. Форма создания работает правильно, но форма обновления выдает ошибку, говоря о уже существующих элементах (мои ограничения основаны на уникальной комбинации двух полей). Независимо от того, какое поле я изменяю в форме обновления, выдается одна и та же ошибка.

Например, изменение только поля «примечания» в экземпляре «сущности» приводит к следующей ошибке.

Объекты с этим именем и компанией уже существуют.

Как правильно реализовать мою форму (и / или модели), чтобы сохранить ограничение (объект с таким же именем должен быть уникальным в пределах компания) и изменение неограниченного поля не приводит к ошибке?

models.py

class Entities(models.Model):
    company = models.ForeignKey(Companies, on_delete=models.CASCADE)
    name =  models.CharField(max_length=50, blank=False, null=False)
    notes = models.TextField(blank=True, null=True)

    class Meta:
        # Constraint here (entity name + company combination name must be unique)
        constraints = [models.UniqueConstraint(fields=['name', 'company'], name='unique_company_entity')]
        managed = True
        db_table = 'entities'

    def __str__(self):
        object_name = self.name + " " + self.company.name
        return object_name 

class Companies(models.Model):
    name =  models.CharField(max_length=50, blank=False, null=False)
    notes = models.CharField(max_length=50, blank=True, null=True)

    class Meta:
        managed = True
        db_table = 'companies'

    def __str__(self):
        object_name = self.name
        return object_name    

views.py

def entity_edit(request,entity_id):
    companies = Companies.objects.all().order_by('name')
    entity_id = int(entity_id)
    entity = Entities.objects.get(id = entity_id)

    if request.method == 'POST': 

        form = EntityEditForm(request.POST,instance=entity)

        if form.is_valid():
            post_result = form.save(commit=True)
            redirect_url_valid = "/contacts/companies/entities/" + str(entity.id) + "/view/"

            return redirect(redirect_url_valid)

    else:
        form = EntityEditForm(instance=entity)

    return render(request,'entity_edit_form.html',{
        'companies': companies,
        'entity': entity,
        'form': form
    }) 

forms.py

 class EntityEditForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.label_suffix = ''
        self.fields['name'] = forms.CharField(label='Name',widget=forms.TextInput(attrs={ 'class': 'form-control' }))
        self.fields['company'] = forms.ModelChoiceField(queryset=Companies.objects.all(),label='Company',required=True,widget=forms.Select(attrs={ 'class': 'form-control' }))   
        self.fields['notes'] = forms.CharField(label='Notes',required=False,widget=forms.Textarea(attrs={ 'class': 'form-control' }))

    class Meta(object):
        model = Entities
        fields = ('name','company','notes')

    # Méthodes de nettoyage des champs du formulaire
    def clean_name(self):
        name = self.cleaned_data['name']
        return name

    def clean_company(self):
        company = self.cleaned_data['company']
        return company

    def clean_notes(self):
        notes = self.cleaned_data['notes']
        return notes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...