Django - Только пользователь Admin может создавать данные. Ограничение FOREIGN KEY не работает для обычных пользователей
Я создаю простое CRUD-приложение, чтобы подтянуть свои навыки работы с Django (это было давно!), но я получаю следующие ошибки, когда неадмин создает что-либо, либо через фронтенд, либо через бэкенд сайта:
FOREIGN KEY constraint failed
Я также получаю эту ошибку, когда вхожу в систему как пользователь admin и пытаюсь обновить поле пользователя в панели Django Admin.
Сама функциональность работает, поскольку я могу создавать действия через frontend и backend, когда я вхожу в систему как суперпользователь. Я также пробовал удалять миграции и т.д., но, похоже, нет никаких решений.
Сам сайт использует модели allauth от Django, но с пользовательскими моделями, чтобы соответствовать общей цели, но я все еще использую модель пользователя AllAuth в качестве внешнего ключа, так как другая модель является UserProfile:
Ниже приведен мой файл models.py для деятельности:
class Activity(models.Model):
class Meta:
verbose_name_plural = 'Activities'
activity_id = models.AutoField(primary_key=True)
host = models.ForeignKey(User, on_delete=models.CASCADE, related_name="activity")
name = models.CharField(max_length=254, null=False, blank=False)
date = models.DateField()
start_time =models.TimeField()
end_time = models.TimeField()
location = models.CharField(max_length=40, null=False, blank=False)
description = models.CharField(max_length=140, null=False, blank=False)
available = models.BooleanField(default=True)
def __str__(self):
return str(self.activity_id)
Вид:
def create_activity(request):
if request.method == "POST":
form = ActivityForm(data=request.POST)
if form.is_valid():
form.instance.host = request.user
activity = form.save(commit=False)
activity.save()
return redirect('activities')
else:
form = ActivityForm()
context = {
'form': form,
}
return render(request, 'activities/new_listing.html', context)
У кого-нибудь есть идеи, почему это происходит?
Вы используете два разных метода добавления данных после валидации формы. К сожалению, вы сохраняете тот метод, в котором данные не добавляются. Я закомментировал эти строки
if form.is_valid():
#activity = form.save(commit=False)
#you would also need: activity.host = request.user
#activity.save()
form.instance.host = request.user
form.save()
Здесь я выбрал метод form.instance (из-за https://www.django-antipatterns.com/antipattern/using-commit-false-when-altering-the-instance-in-a-modelform.html), который должен заставить все работать.