Я использую форму модели, чтобы позволить пользователю помещать данные в базу данных. Эта форма исключает пользовательское поле, поэтому пользователь не может изменить его самостоятельно.
class Meta:
model = Server
exclude = ["user","name", "quirky"]
Вместо этого значение пользовательского поля будет введено после того, как я вызову .save(commit=False).
if neuer_server_form.has_changed() and neuer_server_form.is_valid():
neuer_server = neuer_server_form.save(commit=False)
neuer_server.user = request.user
neuer_server.name = slugify(neuer_server.name)
neuer_server.save()
Из-за этого пользовательское поле исключается из проверки. Теперь есть unique_together между пользовательским полем и другим полем char.
class Meta:
unique_together = ('user', 'name',)
Поскольку пользовательское поле исключено, не будет проверки для unique_together. Поэтому при сохранении экземпляра может возникнуть ошибка IntegrityError.
Где я застрял. Итак, моя первая идея заключалась в том, чтобы проверить БД, существует ли уже CharField, и если да, просто измените его, добавив число, и проверьте еще раз. Но если я сделаю это в порядке возрастания, злоумышленник может вставить много похожих строк, поэтому моему серверу придется выполнять эту проверку бесконечно долго.
Возможные решения: Таким образом, для меня было бы два приемлемых решения: Либо изменить значение CharFields на что-то, что определенно еще не существует, не пытаясь сначала много. Или сделайте проверку неудачной и верните форму пользователю.
Что я пробовал: я думаю, что второй вариант был бы идеальным, но, поскольку я использую набор форм модели и не могу передать пользователя запроса в форму, я не могу сделать это: Проверка Django ModelForm unique_together
Вместо этого мне было интересно, можно ли добавлять в форму самосовершенные ошибки при циклическом просмотре набора форм.
Что-то вроде этого псевдокода:
for form in formset.forms:
if form.is_valid():
server_name = form.cleaned_data.get("name","")
if Server.objects.get(user=request.user,name=server_name).count():
formset.forms[form].errors += "here is my own error message"
formset.forms[form].fields["name"].errors += "this field is wrong"
Любые идеи, как это решить? Спасибо за помощь, если вы дочитали до сюда :)