【问题标题】:Django: Trouble with named URLs instead of idsDjango:命名URL而不是ID的问题
【发布时间】:2017-01-26 00:34:29
【问题描述】:

所以我正在制作一个涉及闪存卡的学习应用程序。用户可以制作主题并将包含卡片的套牌放入其中。因此,例如,在生物学科目中,会有一个名为“unit one”的牌组,而该牌组中会装满纸牌。理想情况下,套牌的 URL 应该是这样的

localhost:8000/subjects/Biology/unit-one/

这是我的代码

views.py

class IndexView(generic.ListView):
  template_name = 'card/index.html'
  context_object_name = 'subjects'

  def get_queryset(self):
      return Subject.objects.all()

class SubjectView(DetailView):
  model = Subject
  slug_field = "subject"
  template_name = 'card/subject.html'

class DeckView(DetailView):
  model = Deck
  template_name = 'card/deck.html'

  def get_object(self, subjects, deck):
      subject_obj = Subject.objects.filter(subject_name=subjects).first()
      obj = Deck.objects.filter(subject=subject_obj, deck_name=deck).first()
      return obj

  def get(self, request, subjects, deck):
      self.object = self.get_object(subjects, deck)
      context = self.get_context_data(object=self.object)
      return self.render_to_response(context)

models.py

class Subject(models.Model):
  subject_name = models.CharField(max_length=100)
  description = models.TextField()

  def __str__(self):
      return self.subject_name

  def get_absolute_url(self):
      return reverse('card:index')

class Deck(models.Model):
  deck_name = models.CharField(max_length=100)
  subject = models.ForeignKey(Subject, on_delete=models.CASCADE)

  def __str__(self):
      return self.deck_name

class Card(models.Model):
  term = models.CharField(max_length=100)
  definition = models.TextField()
  deck = models.ForeignKey(Deck, on_delete=models.CASCADE)

  def __str__(self):
      return self.term

urls.py

url(r'^subjects/(?P<subject>[\w ]+)/$', views.SubjectView.as_view(), name='subject'),
url(r'^subjects/(?P<subject>[\w ]+)/(?P<deck>[\w ]+)/$', views.DeckView.as_view(), name='deck'),

index.html

<li><a href="{% url 'card:subject' subject.subject_name %}">

主题.html

<ul>
  {% for deck in subject.deck_set.all %}
  <li><a href="{% url 'card:deck' deck.deck_name %}">{{deck.deck_name}}</a></li>
  {% endfor %}
</ul>

但是,我收到了这个错误。

Generic detail view SubjectView must be called with either an object pk or a slug.

索引页面显示正常,但是当我点击一个主题时,我得到了那个错误。我该如何解决这个问题?

【问题讨论】:

    标签: python django


    【解决方案1】:

    只是一个假设。尝试将Char更改为Slug

    class Subject(models.Model):
      subject_name = models.SlugField(max_length=100)
      description = models.TextField()
    

    还有

    slug_field = "subject_name"
    

    【讨论】:

    • 没有注意到那个错字!
    【解决方案2】:

    你试过设置SubjectView.slug_url_kwarg吗?

    【讨论】:

    • 没有。我会把它设置成什么?
    • slug_field 将字段连接为标识符,slug_url_kwarg 将 url 参数连接到该字段。所以我相信你也会将它设置为“主题”,因为那是你的 URL 参数。
    • 在对象上也有一个 ._name 字段是多余的。它可以缩写为 .name
    猜你喜欢
    • 2011-03-02
    • 2014-04-09
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 2018-04-30
    相关资源
    最近更新 更多