Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django';用户';对象没有属性';目标';_Python_Html_Django - Fatal编程技术网

Python Django';用户';对象没有属性';目标';

Python Django';用户';对象没有属性';目标';,python,html,django,Python,Html,Django,我创建了一个函数,可以为每个用户保存多个目标,并将它们显示在html文件中。问题是,一旦我注销,我将无法使用相同的用户重新登录,因为我收到错误user对象没有属性Goals,即使它保存在数据库中。我的问题是,是什么导致了这个错误,在我看来,对目标的引用可能,以及什么是潜在的解决方案?谢谢大家! models.py class Goals(models.Model): user = models.ForeignKey(User, null=True, default=None, on_de

我创建了一个函数,可以为每个用户保存多个目标,并将它们显示在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)
你有两个问题:

  • 您不能使用
    instance.Goals
    访问子实例;您应该使用
    instance.goals\u set

  • 您不能
    保存
    查询集。您应该逐个保存
    目标
    实例,即


  • 话虽如此,我建议您将
    Goals
    类重命名为
    Goal
    ,因为这会与Django的命名约定产生混淆。这也是有意义的,因为每一行代表一个
    目标

    尝试将
    相关的\u name='goals'
    添加到目标类的用户字段定义中:

    user = models.ForeignKey(User, related_name='goals', null=True, default=None, on_delete=models.CASCADE)
    
    然后,您应该能够访问用户对象上的此属性:
    user\u instance.goals.all()

    可能需要迁移


    虽然这与问题没有直接关系,但我认为最好以单数形式将模型类命名为“目标”,它将与其他模型的名称一致(模型表示一个对象=一行)并避免在自动多重化中出现歧义。

    我是否需要更改def str和def create_user_目标,因为它们使用的是目标对象而不是目标?对于我视图中的目标项,我也在想同样的事情,
    \uuu str\uuu
    方法没有意义,因为它已经应用于
    目标
    实例,但是是的,您也应该删除它
    create\u user\u goals
    看起来不错,因为它使用
    goals
    类创建了一个新的模型实例。另外,当我尝试登录时,我收到一个错误,“user”对象没有属性“goals”。这个问题仍然存在,对于一些理性的商业来说,你应该考虑接受这个答案,如果这个修复是你在这里的问题:在你之前的问题中。你的<代码>
    并且您不需要在
    goals.save()之后定义
    cur\u goals=goals.objects.filter(user=request.user)
    user = models.ForeignKey(User, related_name='goals', null=True, default=None, on_delete=models.CASCADE)