Django «Пользовательский» объект не имеет атрибута «Цели» - PullRequest
0 голосов
/ 30 января 2019

Я создал функцию, которая может сохранять несколько целей на одного пользователя и отображать их в HTML-файле.Проблема заключается в том, что, как только я выхожу из системы, я не могу войти в систему с тем же пользователем, так как получаю сообщение об ошибке User У объекта нет атрибута Goals, даже если он сохранен в базе данных.Мой вопрос в том, что является причиной этой ошибки, может быть, ссылки на цели, на мой взгляд, и каково потенциальное решение?Спасибо!

models.py

class Goals(models.Model):
    user = models.ForeignKey(User, null=True, default=None, on_delete=models.CASCADE)
    goal = models.CharField(max_length=2000)
    instrument = models.CharField(max_length=255, choices=instrument_list, blank=True)
    goal_date = models.DateField(auto_now=False, auto_now_add=False)

    def __str__(self):
        return self.Goals


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

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


class GoalsForm(ModelForm):
    class Meta:
        model = Goals
        exclude = ('user',)

views.py

def goal_creation(request):
    form = GoalsForm()
    cur_goals = Goals.objects.filter(user=request.user)

    if request.method == 'POST':
        form = GoalsForm(request.POST)

        if form.is_valid():
            goals = form.save(commit=False)
            goals.user = request.user
            goals.save()
            cur_goals = Goals.objects.filter(user=request.user)
            return redirect('/student/goal-progress')

        else:
            form = GoalsForm()

    context = {'form' : form, 'goals': cur_goals}
    return render(request, 'student/goal_creation.html', context)

Ответы [ 2 ]

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

Попробуйте добавить related_name='goals' в определение пользовательского поля класса Goals:

user = models.ForeignKey(User, related_name='goals', null=True, default=None, on_delete=models.CASCADE)

Затем вы сможете получить доступ к этому свойству объекта пользователя: user_instance.goals.all().

Может потребоваться миграция.

Хотя это не имеет прямого отношения к проблеме, я думаю, что лучше назвать класс модели в единственном числе «Цель», это будет соответствовать именам других моделей (модель представляет однообъект = одна строка) и избежать двусмысленности в автоматическом множественном числе.

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

У вас есть две проблемы:

  1. Вы не можете получить доступ к дочерним экземплярам, ​​используя instance.Goals;Вы должны использовать instance.goals_set.

  2. Вы не можете save набор запросов.Вы должны сохранять Goals экземпляров один за другим, то есть

for goal in instance.goals_set.all():
    goal.save()

При этом я рекомендую переименовать ваш класс Goals в Goal, так как это приведет к путаницес соглашениями именования Django.Это также имеет смысл, потому что каждая строка представляет один goal.

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