Пользовательское поле в ингредиентах является первичным ключом, поэтому оно имеет ненулевое ограничение.В тот момент, когда вы вызываете form.save()
, django пытается создать новый экземпляр компонентов из данных, привязанных к форме, и пользователь не привязан к нему, поэтому происходит сбой, потому что он не может создать новый экземпляр с user = None.Должно работать следующее:
instance = form.save(commit=False)
instance.user = request.user
instance.save()
Кроме того, вы можете перезаписать метод сохранения формы.
Редактировать: Теперь я понимаю (я думаю), что вы хотите сделать.Вы хотите расширить модель пользователя с помощью «профиля пользователя».Вот как вы это сделаете: настройте модель ингредиентов по следующей модели UserIngredients (я удаляю аргумент primary_key и добавляю related_name):
class UserIngredients(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='ingredients')
ingredient_1 = models.CharField(max_length=32)
...
Вы можете связать создание / обновление экземпляра User с созданием/ обновить экземпляр UserIngredients с помощью сигналов следующим образом: нам нужен один импорт:
from django.dispatch import receiver
Затем добавьте в файл модели следующее:
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserIngredients.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.ingredients.save()
В конце опустите перезапись__init__
в IngredientForm и настройте метод вашего профиля:
form = IngredientForm(request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.user = request.user
instance.save()
messages.success(request, f'Ingredients added to your account!')
return redirect('profile')