Django:向form>添加外键时,无法分配“<SimpleLazyObject:”,必须是“User”实例

2024-10-01 11:35:47 发布

您现在位置:Python中文网/ 问答频道 /正文

用户使用in-id(父表/模型)查看患者的详细信息,或者选择患者来创建子(表/模型)对象(我希望这是准确的术语)。 我试图用父表中正确的外键“预填充”我的表单。基本上,每个患者都会有几次就诊,并且就诊需要与患者表(主模式)具有正确的外键关系。在

我在views.py文件中得到了与我的def form_valid命令相关的以下错误。如果我删除这个命令,我会得到一个not null错误,因为需要填充字段。我也尝试了get_instance函数,但论坛建议不要这样做,而要支持def form_valid。在

错误

Cannot assign "<SimpleLazyObject: 
<django.contrib.auth.models.AnonymousUser object at 0x10d62d278>>": 
"Visit.fk_visit_user" must be a "User" instance.
 Request Method:    POST
Request URL:    http://127.0.0.1:8000/clincher/visit/add/2
Django Version: 2.0.4
Exception Type: ValueError
Exception Value:    
Cannot assign "<SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x10d62d278>>": "Visit.fk_visit_user" must be a "User" instance.
Exception Location: /Users/nrsmoll/venv/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py in __set__, line 197
Python Executable:  /Users/nrsmoll/venv/bin/python
Python Version: 3.6.4
Python Path:    
['/Users/nrsmoll/PycharmProjects/clincher',
 '/Users/nrsmoll/PycharmProjects/clincher',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6',
 '/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload',
 '/Users/nrsmoll/venv/lib/python3.6/site-packages',
 '/Users/nrsmoll/venv/lib/python3.6/site-packages/setuptools-28.8.0-py3.6.egg',
 '/Users/nrsmoll/venv/lib/python3.6/site-packages/pip-9.0.1-py3.6.egg',
 '/Applications/PyCharm.app/Contents/helpers/pycharm_matplotlib_backend']
Server time:    Wed, 6 Jun 2018 13:16:29 +0000

回溯

^{pr2}$

模型.py

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


class Main(models.Model):
    name = models.CharField(max_length = 256)
    date_of_birth = models.CharField(max_length = 256)
    age = models.CharField(max_length=4)

    def get_absolute_url(self):
        return reverse('clincher:main-detail', kwargs={'pk': self.pk})

    def __str__(self):
        return self.name + ' - ' + self.date_of_birth


class Visit(models.Model):
     fk_visit_main = models.ForeignKey(Main, on_delete=models.CASCADE, verbose_name=('Patient Name'))
    visit_date = models.DateField(auto_now = True, editable=True)
    fk_visit_user = models.ForeignKey(User, on_delete=models.PROTECT, verbose_name=('Practitioner'), max_length=500)

def __str__(self):
    return '%s %s' % (self.visit_date, self.visit_label)

def get_absolute_url(self):
    return reverse('clincher:main-detail', kwargs={'pk': self.pk})

视图.py

class VisitCreate(CreateView):
    model = Visit
    fields = [ 'visit_label', 'visit_type', 'visit_progress_notes']

    def form_valid(self, form):
        form.instance.fk_visit_user = self.request.user **Error Here**
        form.instance.main_id = self.kwargs['pk']
        return super(VisitCreate, self).form_valid(form)

    def get_success_url(self):
        return reverse('clincher:main-detail', args={'pk': self.object.id})

基本上,我需要一个保持亲子关系的表单,如果有更好的方法,或者更有效的方法,请告诉我。在


Tags: djangoinstanceselfformreturnmodelslibdef
1条回答
网友
1楼 · 发布于 2024-10-01 11:35:47

如错误所示,您正在尝试为对象分配匿名用户。这是因为访问您的页面的用户没有登录。您需要在视图中使用LoginRequired mixin,以确保它们已登录。在

相关问题 更多 >