【问题标题】:Cannot access to the second user无法访问第二个用户
【发布时间】:2020-03-25 11:52:57
【问题描述】:

我正在使用图表 js 学习 Django 2.2,我试图在更改 URL 中的 id 时显示我的用户技能。我有 2 个用户,它适用于第一个但不适用于第二个。

这是错误:

Profile matching query does not exist.
Request Method: GET
Request URL:    http://127.0.0.1:8080/skills/2/
Django Version: 2.2
Exception Type: DoesNotExist
Exception Value:    
Profile matching query does not exist.

这是我的个人资料模型,Profile => models.py:

from django.db import models
from django.contrib.auth.models import User
from django.core.validators import FileExtensionValidator

# Create your models here.

class Profile(models.Model):
    name = models.ForeignKey(User, on_delete=models.CASCADE)
    website = models.URLField(blank=True)
    avatar = models.ImageField(upload_to='uploads/img', validators=[FileExtensionValidator(allowed_extensions=['png'])], blank=True)
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    @property
    def get_created(self):
        return self.created.strftime("%m/%d/%Y, %H:%M:%S")

    def __str__(self):
        return "{}-{}".format(self.name, self.get_created)

这是我的技能模型,技能 => models.py

from django.db import models
from profiles.models import Profile
from django.core.validators import MaxValueValidator, MinValueValidator
# Create your models here.


class Skill(models.Model):
    user = models.ForeignKey(Profile, on_delete=models.CASCADE)
    name = models.CharField(max_length=220)
    score = models.PositiveIntegerField(
        validators=[MinValueValidator(1), MaxValueValidator(5)])

    def __str__(self):
        return "{}-{}-{}".format(self.user, self.name, self.score)

这是我的技能网址,技能 => urls.py:

from django.urls import path
from .views import skill_view, UserChartView

app_name = 'skills'

urlpatterns = [
    path('', skill_view, name='my-skills'),
    path('<profile_id>/', UserChartView.as_view(), name='user-skills'),
    ]

这是我的用户视图,Skills => views.py:

from django.shortcuts import render, redirect
from django.forms import inlineformset_factory
from .models import Skill
from profiles.models import Profile
from django.views.generic import TemplateView


# Create your views here.


class UserChartView(TemplateView):
    template_name = 'skills/user_skills.html'

    def get_object(self):
        pk = self.kwargs.get('profile_id')
        return pk

    def get_context_data(self, **kwargs):
        context = super(UserChartView, self).get_context_data(**kwargs)
        profile = Profile.objects.get(name__id=self.get_object())
        qs = profile.skill_set.all()
        context["qs"] = qs
        return context

【问题讨论】:

  • 您应该真正研究自定义用户模型,而不是单独的配置文件模型。
  • 顺便说一句,您的配置文件模型允许每个用户拥有多个配置文件(ForeignKey 而不是 OneToOneField)。这是故意的吗?

标签: django python-3.x django-models django-views


【解决方案1】:
query: name__id=self.get_object() to id=self.get_object()

【讨论】:

    【解决方案2】:

    您在这里的目标是访问User 对象具有id=2 的配置文件,但由于用户模型的名称是profile_id,这可能是Profile 的主键。

    我建议使用DetailView,因为这已经可以完成大部分样板逻辑。您可以在这里简单地确定pk_url_kwarg'profile_id'

    from app.models import Profile
    from django.views.generic import DetailView
    
    class UserChartView(DetailView):
        model = Profile
        pk_url_kwarg = 'profile_id'
        template_name = 'skills/user_skills.html'
    
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['qs'] = self.object.skill_set.all()
            return context

    【讨论】:

    • 我有这个错误:找不到页面 (404) 请求方法:GET 请求 URL:127.0.0.1:8080/skills/1 提出者:skills.views.UserChartView
    • @hugokis: 那么没有主键1Profile。请注意,拥有两个配置文件意味着主键是12。它是负责分发主键的数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多