Ошибка внешних ключей при попытке создать новую запись в Django - PullRequest
0 голосов
/ 26 января 2020

У меня есть две модели, которые связаны отношениями «один ко многим»: активность и пользователи. Пользователь может быть подключен только к 1 действию, но на действие можно ссылаться из нескольких записей пользователя.

// Activity
id | username_id | activity | initial_date | ending_date
--  ------------   --------   ------------  ------------
1  |             |   test   |   2020-01-20 |    None
45 |             |   test45 |   2020-01-25 |    None

// User
username_id |       email       | username | last_login | date_joined |is_admin | is_active | is_staff | is_superuser
------------ -----------------  ----------  ------------  -----------  --------- --- --------------------------------
    2        |  ab@hotmail.com   |   ab     |  2020-01-20 |  2020-01-15|   No    |      No   |     No   |   No      
    3        |  xy@hotmail.com   |   ab     |  2020-01-21 |  2020-01-18|   No    |      No   |     No   |   No      

//models.py 

from django.utils import timezone
from django.contrib.auth import get_user_model
User = get_user_model()

class Activity(models.Model):
    id           = models.AutoField(primary_key=True)
    username_id  = models.ForeignKey(User, on_delete=models.CASCADE)
    activity     = models.CharField(null=False, max_length=140)
    initial_date = models.DateField(default=timezone.now(), null=False)
    ending_date  = models.DateField(default=timezone.now(), null=False)

class User(AbstractBaseUser):
   username_id  = models.AutoField(primary_key=True)
   email        = models.EmailField(verbose_name="email", max_length=60, unique=True)
   username     = models.CharField(max_length=30, unique=True)   

   last_login   = models.DateTimeField(verbose_name='last login', auto_now=True)
   date_joined  = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
   is_admin     = models.BooleanField(default=False)
   is_active    = models.BooleanField(default=True)
   is_staff     = models.BooleanField(default=False)
   is_superuser = models.BooleanField(default=False)

   USERNAME_FIELD = 'email' 
   REQUIRED_FIELDS = ['username']


//forms.py
from .models import Activity
from django import forms

class ActivityModelForm(forms.ModelForm):
    model = Activity
    fields = ['username_id', 'activity', 'initial_date', 'ending_date']

def __init__(self, *args, **kwargs):
    super(ActivityModelForm, self).__init__(*args, **kwargs)
    self.fields['username_id'].required = False
    self.fields['activity'].required = True
    self.fields['initial_date'].required = False
    self.fields['ending_date'].required = False

Как видно из таблиц, столбец username_id имеет пустые значения, поэтому я изменил свой код в views.py при попытке сохранить новое действие, но теперь я сталкиваюсь с ошибкой ValueError: Cannot assign "3": Activity.username" must be a user instance.

def create_activity(request):
    form_create = ActivityModelForm(request.POST or None)
    username_id = None
    if request.user.get_username():
        username_id = request.user.id

    if form_create.is_valid():
        obj = form_create.save(commit=False)
        obj.username = username_id
        obj.save()
        form_create = ActivityModelForm()
    template_name = 'activity/formActivity.html'
    context = {'form': form_create}
    return render(request, template_name, context}

1 Ответ

1 голос
/ 26 января 2020

Назначение пользователя из пользовательской модели в request.user

     username_id = User.objects.get(user=request.user)
     if form_create.is_valid():
            obj = form_create.save(commit=False)
            obj.username = username_id
            obj.save()
     form_create = ActivityModelForm()
...