Django: ошибка проверки формы самоссылающегося поля OneToOne (модель с этим полем уже существует)

Ребята, не могли бы вы подсказать..

Я только что сделал одно поле в модели, которое ссылается на себя. У меня проблема с коллизией при проверке формы, когда я пытаюсь отредактировать уже созданную модель с уже заполненным полем onetoone с ТАКИМ ЖЕ экземпляром, поскольку он был назначен с нуля. Если я оставлю то же отношение (экземпляр, который был назначен ранее) в поле, он вернет ошибку: Модель (имя моей модели) с этим полем (имя моего поля) уже существует, но если я изменю значение поля в форме на другой экземпляр, он в конечном итоге проверит эту форму без каких-либо проблем. Итак, мое решение, которое пришло мне в голову, состоит в том, чтобы переопределить методы проверки/очистки в форме. Это правильный способ справиться с этой проблемой? И если это правда, то как написать правильный код для обработки этого случая?

Для ясности я прикрепляю свой код ниже:

Models.py

db_dr = models.OneToOneField('self', on_delete=models.CASCADE, blank=True, null=True)

Часть кода в views.py

form = DatabaseInfoForm(initial=data)
if request.method == 'POST':
   form = DatabaseInfoForm(request.POST)
   if form.is_valid():

person Oleg Radchenko    schedule 29.11.2020    source источник


Ответы (1)


вы не вводите свой полный код для справки, поэтому вот пример, если, скажем, у вас есть две модели: сотрудник и компания:

class Employee(models.Model):
    name = models.CharField(max_length=25)
    created_name = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name


class Company(models.Model):
    employee = models.OneToOneField(Employee, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    direction = models.CharField(max_length=80)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

Предполагая, что у вас уже есть форма сотрудника, мы просто создадим форму компании:

class CompanyForm(ModelForm):
    class Meta:
        model = Company
        fields = (
            'employee', 'name', 'direction',
        )

уже имея модели и формы компании, остается только создать представления, сначала мы начнем с создания:

def company_creation(request):
    template_name = 'your template'
    form = CompanyForm(request.POST)

    if request.method == 'POST' and form.is_valid():
        form.save()
        return redirect('your url')

    return render(request, template_name, {
        'form': form,
    })

затем мы создаем вид модификации:

def company_edit(request, pk):
    template_name = 'your template'

    # here we get the data we want to modify
    company = Company.objects.get(pk=pk)
    form = CompanyForm(request.POST, instance=company)

    if request.method == 'POST' and form.is_valid():
        form.save()
        return redirect('your url')

    return render(request, template_name, {
        'form': form,
    })

наконец, мы просто создаем URL:

app_name = 'company'
urlpatterns = [
    path('create/', views.company_creation, name='create'),
    path('edit/<pk>/', views.company_edit, name='edit'),
]

и таким образом создавать и редактировать, без каких-либо проблем

person cosmos multi    schedule 29.11.2020
comment
Какой позор.. Я просто не заметил, что предыдущий разработчик перенес инициал в форму, но он забыл передать экземпляр в форму... Спасибо за подробное объяснение. - person Oleg Radchenko; 30.11.2020