(1062, "Дублирующая запись '2' для ключа 'user_id'") - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь обновить профиль путем обрезки изображения, после обрезки изображения оно дает мне строку base64, которую я должен преобразовать в изображение и сохранить на сервере, а также его URL в базе данных.Я получаю изображение на сервере, но не могу сохранить его URL в базе данных.

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.FileField(default='default.jpg', 
    upload_to='profile_pics')

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

    def save(self, *args, **kwargs):
          #super(Profile, self).save(*args, **kwargs)
          super().save()
          img = Image.open(self.image.path)

          if img.height > 300 or img.width > 300:
              output_size = (300,300)
              img.thumbnail(output_size)
              img.save(self.image.path)     

forms.py

class ProfileUpdateForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['image']

просмотров.py

#profile view
@login_required
def profile(request):
    #if any changes POST data
    if request.method == 'POST':
        image_data = request.POST['image']
        format12,img = image_data.split(';base64,')
        ext = format12.split('/')[-1]
        imageObj = ContentFile(base64.b64decode(img+"=="))
        file_name = "myphoto."+ext
        #print(file_name)
        #Profile.image = data
        #Profile.save(file_name, data, save=True)
        #Profile.save()
        profile = Profile()
        #profile.user_id = request.user.id
        #profile.image= imageObj
        u_form = UserUpdateForm(request.POST, instance=request.user)
        p_form = ProfileUpdateForm(request.POST, request.FILES,instance=request.user.profile)

        #check if both forms are valid
        if u_form.is_valid() and p_form.is_valid():
            u_form.save() # if yes Save
            profile.image.save(file_name, imageObj)
            profile.save()
            #p_form.save() # if yes save
            messages.success(request, format('Your Profile has been updated.'))
            return redirect('profile')
    else:
        u_form = UserUpdateForm(instance=request.user)#instance will show previous data in forms
        p_form = ProfileUpdateForm()#instance will show previous data in forms

    # Send form data to the template
    context = {
        'u_form': u_form,
        'p_form': p_form,
    }
    return render(request, 'users/profile.html', context)

Я получаю сообщение об ошибке:

django.db.utils.IntegrityError: (1062, "Duplicate entry '2' for key 'user_id'")

Кто-нибудь, кто может помочь мне в этом?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Обновление Все готово Это views.py

@login_required
def profile(request):

    if request.method == 'POST':
        image_data = request.POST['image']
        b = json.loads(image_data)
        head, data = b["output"]["image"].split(',')
        binary_data = a2b_base64(data)
        profile = Profile()

        u_form = UserUpdateForm(request.POST, instance=request.user)
        p_form = ProfileUpdateForm(request.POST, request.FILES,instance=request.user.profile)

        if u_form.is_valid() and p_form.is_valid():
            u_form.save() # if yes Save
            profile.image.save('whatever.jpg', ContentFile(binary_data), save=False)

            t = Profile.objects.get(user_id=request.user.id)
            t.image = 'profile_pics/whatever.jpg'  
            t.save() 

            messages.success(request, format('Your Profile has been updated.'))
            return redirect('profile')
    else:
        u_form = UserUpdateForm(instance=request.user)#instance will show previous data in forms
        p_form = ProfileUpdateForm(instance=request.user.profile)#instance will show previous data in forms
    # Send form data to the template
    context = {
        'u_form': u_form,
        'p_form': p_form,
    }
    return render(request, 'users/profile.html', context)

Перейдите по этой ссылке https://vinta.ws/code/read-and-save-file-in-django-python.html, если вы хотите узнать, как преобразовать изображение base64.

0 голосов
/ 14 декабря 2018

Ваш объект профиля является 1-к-1 с пользователем, что означает, что единственная цель, если я не ошибаюсь, для вас, чтобы создать объект профиля, это добавить дополнительные поля.Учитывая это, вам не требуется идентификатор для отслеживания профиля, вместо этого полагайтесь на модель пользователя, которая по умолчанию поставляется с Django.Попробуйте удалить:

profile.user_id = request.user.id

и посмотрите, поможет ли это.По сути, где-то в вашей базе данных вы пытаетесь снова сохранить объект User с идентификатором (первичным ключом), равным 2.Чтобы быстро сохранить изменения, внесенные в объект профиля, выполните следующее:

user = User.objects.get(id=request.user.id)
user.profile.some_property = some_value
user.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...