Внешние ключи Django: settings.AUTH_USER_MODEL продолжает давать null для form.save

avatar
red8alice
27 октября 2015 в 16:34
2487
1
1

Я читал статьи и пытался реализовать в моделях.

user = models.ForeignKey(settings.AUTH_USER_MODEL) 

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

например:

class Degree(models.Model):

    user = models.ForeignKey(settings.AUTH_USER_MODEL)

    degreeLevel = models.CharField(max_length = 50)

     areaOfStudy = models.CharField(max_length = 50)

У меня такое ощущение, что при создании пользователя мне нужно создать сигнал для всех моделей, которые используют user = models.ForeignKey (settings.AUTH_USER_MODEL), но я изо всех сил пытаюсь найти ресурс, который занимается этой проблемой от начала до конца, поэтому Не знаю, в чем я ошибаюсь.

Любая помощь была бы отличной ...

Этот вопрос касается profiles_details.id не существует Django

Спасибо.

Я пробовал:

user = models.ForeignKey (settings.AUTH_USER_MODEL, null = False, on_delete = models.CASCADE, verbose_name = _ (u "Пользователь")) Но появилось сообщение об ошибке при выполнении миграции:

 NameError: name '_' is not defined

если я возьму подробное имя и попытаюсь выполнить миграцию, я получу: эта ошибка:

Вы пытаетесь добавить к деталям поле "пользователь", не допускающее значения NULL, без значения по умолчанию; мы не можем этого сделать (базе данных нужно что-то для заполнения существующих строк). Пожалуйста, выберите исправление: 1) Укажите одноразовое значение по умолчанию (будет установлено для всех существующих строк) 2) Закройте и позвольте мне добавить значение по умолчанию в models.py

Также смотрел https://docs.djangoproject.com/en/dev/topics/auth/customizing/#referencing-the-user-model

Но не понял, что делать с:

 django.contrib.auth.get_user_model().
Источник
Daniel Roseman
27 октября 2015 в 17:01
0

Вы действительно установили какое-либо значение пользователя при создании новой степени?

red8alice
27 октября 2015 в 18:18
0

нет, я не знал, я не знаю, как это сделать, я предположил, что django получит пользователя входа / регистрации и заполнит это пространство настройками. AUTH_USER_MODEL), поскольку учебник действительно не углубляется в это ... Если бы вы могли указать мне на один или объясни, что было бы здорово

Ответы (1)

avatar
FSp
28 октября 2015 в 01:21
1

Я вижу несколько деталей, на которые следует обратить внимание в вашем вопросе:

  1. Если вы хотите, чтобы поле user не было обязательным, вы должны изменить его на:

     user = models.ForeignKey (...  null=True,...)
    
  2. Если вы хотите решить проблему, связанную с тем, что _ не распознается, вы должны добавить следующий импорт поверх своего файла:

      from django.utils.translation import ugettext as _
    
  3. Если вы хотите заполнить поле user в представлении, вы можете сделать это следующим образом:

     from django.views.generic import View
    
     class MyView(View):
         ...
    
         def get(request, *args, **kwargs):
    
             myobject = Degree.objects.get(...) # do some query 
             myobject.user = request.user
             myobject.save()
    
             return ...
    

    при условии, что ваше представление обрабатывает запрос на получение и хочет назначить текущего пользователя объекту user.

  4. о том, как использовать: django.contrib.auth.get_user_model вот пример

    from django.contrib.auth import get_user_model
    
    ...
    
    
    def create_user(username, first_name, last_name, *args, **kwargs):
    
        user_class = get_user_model()
        new_user = user_class.objects.create(username=username,
            first_name=first_name, last_name=last_name)
    

    в основном функция get_user_model возвращает вам класс, который вы настроили в settings.AUTH_USER_MODEL. из него вы можете получить доступ, например, к его менеджерам (например, objects) и запросить или создать новые экземпляры.

red8alice
28 октября 2015 в 22:14
0

Спасибо большое, что пригодились ... :)