【问题标题】:Django simple categories listDjango简单类别列表
【发布时间】:2018-10-06 17:34:54
【问题描述】:

很抱歉问了这么简单的问题,但我被困在(我认为)这个微不足道的问题上。我在 Django 中有一个简单的画廊模型,并且想要获取照片的类别列表。我的模型如下所示:

class Photo(models.Model):
    title = models.CharField(max_length=150)
    image = models.ImageField()
    description = models.TextField()
    category = models.IntegerField(choices=CATEGORIES)
    published = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.title

choices.py 文件如下所示:

CATEGORIES = (
    (1, ('Mountains')),
    (2, ('Animals')),
    (3, ('Macro')),
    (4, ('People'))
)

我正在寻找的是这样的列表:

Mountains | Animals | Macro | People

在我的模板中。

【问题讨论】:

  • 您知道一张照片可以有一个类别,因此您不能在模板中显示所有类别,除非您只是通过上下文视图使用它并在模板中循环浏览它
  • 为什么这个问题被否决了?致反对者:请解释原因或收回您的反对票。我们不想阻止新用户发布问题。这个问题不值得一票否决。

标签: django python-3.x django-templates


【解决方案1】:

您需要为此创建模型表单,

models.py

CATEGORIES = (
    (1, 'Mountains'),
    (2, 'Animals'),
    (3, 'Macro'),
    (4, 'People')
)

class Photo(models.Model):
    title = models.CharField(max_length=150)
    image = models.ImageField()
    description = models.TextField()
    category = models.IntegerField(choices=CATEGORIES)
    published = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.title

form.py

from django import forms
from .models import Photo

class PhotoModelForm(forms.ModelForm):
    class Meta:
        model = Photo
        fields = ['__all__']

views.py

from django.shortcuts import render
form .forms import PhotoModelForm
def index(request):
    if request.POST:
        form = PhotoModelForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        form = PhotoModelForm()
    return render(request, 'template.html', {'form': form})

模板.py:

<form method="POST">
    {% csrf_token %}
    {{form}}
    <input type="submit" value="ok"/>
</form>

我正在寻找的是这样的列表:

Mountains | Animals | Macro | People

创建新表单,例如,

 class PhotosForm(forms.Form):
        category = forms.ChoiceField(choices=CATEGORIES)

将视图添加到views.py

def show_list(request):
    context = {}
    if request.POST:
        form = PhotosForm(request.POST)
        if form.is_valid():
            photos = Photo.objects.filter(category=form.cleaned_data['category'])
            context['photos'] = photos
    else:
        context['form'] = PhotosForm()
        context['categories'] = dict((x, y ) for x, y in CATEGORIES)
    return render(request, 'template1.html', context)

最后你需要添加模板,

{% if photos %}


<display pics>

{% else %}


{% for key, value in categories %}

     <a href='showpics?id={{key}}'>{{value}}</a>

{% endfor %}

最后一个showpics应该指向show_list

【讨论】:

  • 答案很好,很彻底。它从模型一直到模板,并解释了如何创建新对象。然而,OP 提出的问题略有不同。
  • 非常感谢您的帮助,终于可以继续我的项目了。实际上,我所需要的只是视图和模板中的那一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 2023-03-23
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多