#python #django #django-models #django-forms #django-views
#python #django #django-модели #django-forms #django-просмотры
Вопрос:
Как ограничить каждого вошедшего в систему пользователя созданием только одного экземпляра / объекта из интерфейса?
вот мой model
выглядит так:
class MyModel(models.Model):
u_name = models.OneToOneField(User, on_delete=models.CASCADE)
category = models.ForeignKey(Category, blank=True, null=True, on_delete=models.CASCADE)
...
...
my_linkedin = models.URLField(unique=True, blank=True, null=True)
my_price = models.CharField(max_length=20, default=0)
joined = models.DateTimeField(default=now, editable=False)
def __str__(self):
return self.my_name
def clean(self):
model = self.__class__
if model.objects.count() > 0 and
self.id != model.objects.get().u_name_id:
print('hell')
raise ValidationError("You can only create 1 profile ")
мой views
:
class MyCreateView(LoginRequiredMixin, CreateView):
model = MyModel
fields = [
'category',
....
....
]
template_name = 'index/form.html'
success_url = '/'
def form_valid(self, form):
form.instance.u_name = self.request.user
return super().form_valid(form)
И мой form
:
class MyModelForm(forms.ModelForm):
class Meta:
model = MyProfile
fields = '__all__'
exclude = ['u_name']
Проблема в том, что текущий код здесь они не могут назначить каждому вошедшему в систему пользователю.
Поэтому, когда я пытаюсь войти в систему с помощью другого пользователя, ошибка выглядит так:
get() returned more than one MyModel -- it returned 3!
Как я могу этого добиться?
Ответ №1:
def clean(self):
model = self.__class__
if model.objects.count() > 0 and
self.id != model.objects.get().u_name_id:
print('hell')
raise ValidationError("You can only create 1 profile ")
model.objects.get()
-> Это причина этой ошибки. get()
должен возвращать только один объект из этой таблицы. Но из того, что я вижу, в этой таблице 3 строки. Вы должны добавить параметры в функцию get, возвращающую один объект, тогда вы сможете получить доступ к этому объекту u_name_id. Вот так:
if model.objects.count() > 0 and model.objects.filter(u_name_id = self.u_name_id).count > 0:
print("hell")
raise ValidationError("You can only create 1 profile ")
Или:
from django.core.exceptions import ObjectDoesNotExist
.
.
.
if model.objects.count() > 0:
try:
obj = model.objects.get(u_name_id = self.u_name_id)
print("hell")
raise ValidationError("You can only create 1 profile ")
except ObjectDoesNotExist:
pass # this is not problem for you because this user have not object