【问题标题】:How to query a user's display information in the AccountDisplayInformation from the AccountModel如何从AccountModel查询用户在AccountDisplayInformation中的显示信息
【发布时间】:2021-05-11 20:31:35
【问题描述】:

Account 是我的 AUTH_USER_MODEL,AccountDisplayInfo 包含每个帐户的所有附加显示信息。所以他们可以输入和提交,然后更新他们的信息。这些是我的代码,但我不确定为什么它不起作用。首先,我收到此错误:

DoesNotExist at /account/5/displayinfo/ AccountDisplayInfo matching query does not exist.

其次,“更新”功能不起作用。

models.py

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

class AccountDisplayInfo(models.Model):
    account = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    instagram = models.CharField(max_length=50, unique=True, blank=True, null=True) #instagram

.html

<form method="POST" enctype="multipart/form-data">{% csrf_token %}

{{ form.as_p }}


<div class="d-flex justify-content-center">
<button type="submit" class="btn btn-primary btn-sm col-lg-5">Update</button>
</div>

</form>

views.py

def display_information_view(request, *args, **kwargs):
 user_id = kwargs.get("user_id")
 account = Account.objects.get(pk=user_id)
 context = {}
 displayinfo = AccountDisplayInfo.objects.get(account=account)
 if request.POST:
  form = DisplayInformationForm(request.POST, request.FILES, instance=request.user)
  if form.is_valid():
      info = form.save(commit=False)
      info.account = request.user
      info.save()
      messages.success(request, 'Your profile display information have been updated', extra_tags='editdisplayinfo')
      return redirect("account:view", user_id=account.pk)
  else:
   form = DisplayInformationForm(request.POST, instance=request.user,   
   initial={
     "instagram": displayinfo.instagram,
    }
   )

   context['form'] = form
 else:
  form = DisplayInformationForm(
    initial={
     "instagram": displayinfo.instagram,
    }
   )
  context['form'] = form
 return render(request, "account/displayinfo.html", context)


forms.py

class DisplayInformationForm(forms.ModelForm):
    class Meta:
        model = AccountDisplayInfo
        fields = ('instagram')


另外,如果您能就此提出建议,那就太好了:: 如果我有 2 张桌子。表 1 和表 2。表 2 有表 1 的外键,但表 1 没有表 2 的外键。如何从表 1 中查询表 2 的数据?谢谢

【问题讨论】:

  • 您确定已为您的帐户创建了AccountDisplayInfo 实体吗?
  • @SLDem 不,我没有兄弟。但是如果我没有创建它,它不应该显示为空白让我填写吗?
  • 所以第一次是输入,随后会被认为是更新
  • 好的兄弟,我在管理员中尝试过,如果我为此创建了一个条目,它就可以工作。但是,更新不起作用。表单已注册为有效,但我插入的新更新未注册
  • 您确定您的表单有效吗?

标签: django django-models django-views django-forms django-templates


【解决方案1】:

默认情况下,.get() 将返回 DoesNotExist 异常,如果没有对象匹配您执行的查询并停止代码运行,因此如果您想在同一页面上手动输入它,请改用 filter:

displayinfo = AccountDisplayInfo.objects.filter(account=account).first()

然后在你的模板中做这样的事情:

{% if displayinfo %}
   ... show display info...
{% else %}
   <p> No info yet </p> <!-- (or show some form) -->
{% endif %}

回答你的其他问题:

您必须使用related_name 或相关模型属性来访问ForeignKey 数据或使用带有_set 后缀的模型名称,例如:

class Post(models.Model):
    title = models.CharField(max_lenght=10)

class Comment(models.Model):
    body = models.CharField(max_lenght=200)
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')

然后你会得到Post 和它的cmets:

post = Post.objects.get(pk=1)
comments = post.comments.all()

如果您的模型字段中没有 related_name 属性,您可以这样做:

comments = post.comment_set.all()

更新

也许问题出在您的 Form 类中,请尝试从中删除 save 方法,然后在您的视图中执行此操作:

if request.POST:
    form = DisplayInformationForm(request.POST, request.FILES, instance=request.user)
    if form.is_valid():
        info = form.save(commit=False)
        info.account = request.user
        messages.success(request, 'Your profile display information have been updated', extra_tags='editdisplayinfo')
        info.save()
        return redirect("account:view", user_id=account.pk)

【讨论】:

  • 第二个答案非常详细。谢啦兄弟。但是对于第一个问题,为什么即使已经有条目,更新也不起作用。表单已注册为有效,但我插入的新更新未注册
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 2019-06-12
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多