【问题标题】:Django get attribute from urls into filterDjango从url获取属性到过滤器
【发布时间】:2019-05-09 19:28:23
【问题描述】:

您好,我是 django 新手,我正在尝试制作一个网站,提供包含季节和剧集的系列。

我成功地为 Serie 创建了 CreateView。现在我要为这个季节做 CreateView。它应该看起来像这样。

季节:
[1] [2] [3] [添加]

如果您点击添加,它应该会显示一个带有季节表单的模式。我的代码如下所示:

models.py

class Serie(models.Model):
    title = models.CharField(max_length=120)
    thumbnail = models.ImageField(upload_to=serie_dir_path)
    ...


class Season(models.Model):
    order = models.IntegerField()
    serie = models.ForeignKey(Serie, on_delete=models.CASCADE)
    ...

class Episode(models.Model):
    title = models.CharField(max_length=120)
    order = models.IntegerField()
    episode = models.FileField(upload_to=episode_dir_path)
    season = models.ForeignKey(Season, on_delete=models.CASCADE)

urls.py

urlpatterns = [
    path('library', LibListView.as_view(), name='library'),
    path('series/<int:pk>/season/<int:order>', SeriesDetailView.as_view(), name='serie-detail'),
]

views.py

class SeasonCreateView(LoginRequiredMixin, CreateView):
    model = Season
    fields = ['order']

    def get_context_data(self, **kwargs):
        context = super(SeasonCreateView, self).get_context_data(**kwargs)
        context.update({
            'serie': Serie.objects.filter()
        })
        return context

season_form.html

{% for season in serie.season_set.all %}
...
{% endfor %}

我必须在从 url 获取 Serie 的 filter() 中写入什么内容?

【问题讨论】:

  • 您为什么认为这会起作用? serie 应该来自哪里?
  • 对不起,我不知道。正如我所说,我是 django 的新手,我只是在尝试。

标签: python django django-urls


【解决方案1】:

从url获取参数:

parameter = request.GET.get("parameter_name")

过滤它:

'serie': Serie.objects.filter(model_field_name=parameter)

【讨论】:

  • 我尝试了以下方法,但没有成功。难道我做错了什么? parameter = self.request.GET.get("pk")'serie': Serie.objects.filter(id=parameter)
  • 这两行都在the get_context_datadef
  • 没有错误信息。它只是没有显示任何季节^^
  • 好的。我认为最简单的方法是检查什么是空的尝试这样的事情:print("parameter: "+self.request.GET.get("pk")) print("query: "+Serie.objects.filter(id=parameter)) 并检查控制台:)
  • 并使用pk 而不是id :)
【解决方案2】:

好的,我自己搞定了。我用get_object_or_404

def get_context_data(self, **kwargs):
    s = get_object_or_404(Serie, id=self.kwargs.get('pk'))
    context = super(SeasonCreateView, self).get_context_data(**kwargs)
    context.update({
        'serie': s
    })
    return context

【讨论】:

    【解决方案3】:
    {% for season in serie.season_set.all %}
    
    <p>{season}</p>
    {% endfor %}
    

    请在 for 循环定义中尝试 all() 而不是 all

    【讨论】:

    • 你不能使用()在Django模板中进行函数调用,OP的语法对于在查询集上调用.all()是正确的
    猜你喜欢
    • 2023-02-24
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2021-07-03
    • 1970-01-01
    相关资源
    最近更新 更多