Не удалось выполнить ограничение UNIQUE: new__users_profile.user_id. Python Django - PullRequest
0 голосов
/ 29 февраля 2020

django .db.utils.IntegrityError Сбой ограничения UNIQUE sqlite3.IntegrityError: Сбой ограничения UNIQUE: new__users_profile.user_id Вышеуказанное исключение было прямой причиной следующего исключения: new__users_profile.user_id

1004 *

Ошибка возникает при попытке регистрации нового пользователя, входа в систему для существующего пользователя и при попытке миграции. Я попытался удалить все миграции и выполнить миграцию еще раз, но это не помогло

models.py

from django.db import models
from django.contrib.auth.models import User


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

    def __str__(self):
        return f'{self.user.username} Profile'

class Media(models.Model):    
    image_name = models.CharField(max_length=50)
    image_description = models.CharField(max_length=80)
    image_image = models.ImageField(upload_to='media', default='default.jpg')

views

from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User

from .forms import UserRegisterForm, MediaForm
from .models import Media


def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            messages.success(request, f'Your account has been created! You are now able to log in')
            return redirect('login')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form': form})


@login_required
def profile(request):

    if request.method == 'GET':
        media_images = Media.objects.all()


    context = {
        'media_images':media_images,

    }
    return render(request, 'users/profile.html', context)

@login_required
def add_media(request):

    if request.method == 'POST':
        form = MediaForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('http://127.0.0.1:8000/')
    else:
        form = MediaForm()

    return render(request, 'users/add_media.html', {'form':form})

forms.py

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import *

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

class MediaForm(forms.ModelForm):

    class Meta:
        model = Media
        fields = ['image_name', 'image_description', 'image_image']
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile


@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
    instance.profile.save()

1 Ответ

0 голосов
/ 26 апреля 2020

Я думаю, вам нужно primary_key=True,

class Profile(models.Model):
    user = models.OneToOneField(User, primary_key=True, on_delete=models.CASCADE, null=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...