Django Forms обновляет существующие данные в модели с помощью form.save()
Я хочу проверить форму, а затем:
- Переопределите существующую строку в
intuser
, если строка с samAccountName уже существует. - Создайте новый объект
intuser
, если ни одинintuser
сsamAccountName
не существует.
models.py
class userdb(models.Model):
samAccountName= models.CharField(max_length=50, primary_key=True)
givenName= models.CharField(max_length=100)
surName= models.CharField(max_length=100)
accountExpires=models.DateField()
enabled= models.BooleanField()
lastLogonDate= models.DateField()
passwordLastSet= models.DateField()
department=models.CharField(max_length=50)
usertype=models.CharField(max_length=3)
def __str__(self):
return f"{self.samAccountName}"
class intuser(models.Model):
samAccountName = models.OneToOneField(
userdb,
on_delete=models.CASCADE,
primary_key=True,
)
manager= models.CharField(max_length=100)
sosafe=models.IntegerField()
form.py
class intUserInfoForm(forms.ModelForm):
manager =forms.ModelChoiceField(queryset=userdb.objects.all(),widget=forms.Select(attrs={'class':'form-select','data-live-search':'true'}))
class Meta:
model=intuser
fields = '__all__'
widgets ={
'sosafe':forms.TextInput(attrs={"class":"form-control"})
}
Views.py
elif(request.POST["usertypeID"]=="int"):
intForm=intUserInfoForm(request.POST)
if intForm.is_valid():
intForm.save()
data={
"usertype":"int",
'form':intForm,
}
return render(request,'test.html',data)
else:
data={
"usertype":"int",
'form':intForm,
}
return render(request,'test.html',data)
Когда я пытаюсь проверить форму с помощью is_valid()
, метод возвращает false
, когда intuser
уже существует. Вероятно, это происходит потому, что OneToOneField
в models.py
.
Как я могу проверить данные, если intuser
уже существует.
Кажется, я нашел ответ.
Я исключил поле из формы, так что is_valid()
больше не валидирует поле:
forms.py
exclude = ('samAccountName',)
Затем я изменил views.py
, где я снова добавляю поле в форму, чтобы сохранить его.
views.py
tempform=intForm.save(commit=False)
tempform.samAccountName = userdb.objects.get(samAccountName=request.POST['samAccountName'])
tempform.save()