Нулевое значение в столбце "user_id" нарушает ненулевое ограничение формы Джанго - PullRequest
0 голосов
/ 16 января 2019

Попытка осуществить загрузку файла для страницы профиля пользователя. Я получаю следующую ошибку:

Нулевое значение в столбце "user_id" нарушает ненулевое ограничение ДЕТАЛИ: Недостающий ряд содержит (35, профиль / {сейчас:% Y /% m / YmdHMSext_xg2iZ6M, ноль, ноль).

Я читал, что, возможно, это как-то связано с User_ID, я пытался передать form.user = request.user, но это не сработало. Есть также два нуля, а не только один.

Models.py

class User(AbstractUser):
    # First Name and Last Name do not cover name patterns
    # around the globe.
    name = models.CharField(_('Name of User'), blank=True, 
    max_length=255)
    #accepted_terms_of_service = models.Booleanfield()

    def __str__(self):
        return self.username

    def get_absolute_url(self):
        return reverse('users:detail', kwargs={'username': 
self.username})

# Profile Image
def upload_to(instance, filename):
    now = timezone_now()
    base, ext = os.path.splitext(filename)
    ext = ext.lower()
    return "profile/{now:%Y/%m/%Y%m%d%H%M%S}{ext}"

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, 
on_delete='CASCADE', related_name='user_profile')
    school = models.CharField(max_length=30, null=True, blank=True)
    image = models.ImageField(_("Picture"), upload_to=upload_to, 
null=True, blank=True)

    def __str__(self):
        return self.user.username

views.py

@login_required
def add_image(request):
     form = ProfileImageForm()
     #form.user = request.user
     if request.method == "POST":
         form = ProfileImageForm(data=request.POST, files=request.FILES)
     if form.is_valid():
         form.save()
         return redirect('userPage')
     else:
         return render(request, "users/user_image_form.html", {"form": form
        })

forms.py

class ProfileImageForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ["image"]

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Я думаю, что не обязательно иметь и модель профиля, и пользовательскую модель пользователя . Потому что, поскольку вы уже настраиваете модель User, почему бы не добавить поля модели Profile в модель User. Вы можете подойти так:

# model

def upload_to(instance, filename):
    now = timezone_now()
    base, ext = os.path.splitext(filename)
    ext = ext.lower()
    return "profile/{now:%Y/%m/%Y%m%d%H%M%S}{ext}"


class User(AbstractUser):
    name = models.CharField(_('Name of User'), blank=True, 
    max_length=255)
    school = models.CharField(max_length=30, null=True, blank=True)
    image = models.ImageField(_("Picture"), upload_to=upload_to, 
                              null=True, blank=True)

    def __str__(self):
        return self.username

    def get_absolute_url(self):
        return reverse('users:detail', kwargs={'username': 
self.username})

# views

@login_required
def add_image(request):
     form = ProfileImageForm(data=request.POST or None, file=request.FILES or None, instance=request.user)
     if request.method == "POST":

        if form.is_valid():
             form.save()
             return redirect('userPage')

     return render(request, "users/user_image_form.html", {"form": form
        })

# forms.py

class ProfileImageForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ["image"]

Обновление

Вы можете создать сигнал post_save , который будет создавать экземпляр профиля после создания каждого пользователя.

def create_user_profile(sender, instance, created, **kwargs):

    if created:
        profile = Profile(user=instance)
        profile.save()

post_save.connect(create_user_profile,
                  sender=User,
                  dispatch_uid="profilecreation-signal")

Теперь в вашей форме вы можете напрямую передать этот Profile экземпляр:

@login_required
def add_image(request):
     form = ProfileImageForm(data=request.POST, files=request.FILES, instance=request.user.profile)

     if request.method == "POST":
         if form.is_valid():
             form.save()
             return redirect('userPage')
     else:
         return render(request, "users/user_image_form.html", {"form": form
        })

Для существующего пользователя вы можете создать профиль из оболочки:

for user in User.objects.all():
    Profile.objects.get_or_create(user=user)
0 голосов
/ 16 января 2019

Это связано с тем, что в вашей модели Profile вы добавляете столбец user в качестве ForeignKey, который приводит к NOT NULL, поэтому возникает ошибка. Чтобы решить эту проблему, вам нужно изменить метод add_image примерно так:

@login_required
def add_image(request):
     form = ProfileImageForm()
     #form.user = request.user
     if request.method == "POST":
         form = ProfileImageForm(data=request.POST, files=request.FILES)
     if form.is_valid():
         form = form.save(commit=False) # change is here
         form.user=request.user.pk # change is here
         form.save()
         return redirect('userPage')
     else:
         return render(request, "users/user_image_form.html", {"form": form

Значение request.user.pk получают, если вы вошли в систему. Но если вы вошли в систему, вам нужно указать form.user = your_specified_id, идентификатор которого существует в таблице User. Если это ваш случай, вы являетесь администратором, и вам нужно добавить изображение другим пользователям, чтобы вам нужно было передать идентификатор пользователя в методе add_image.

Добавить в ProfileImageForm.py добавить user в список полей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...