繁体   English   中英

Django 显示来自两个不同模型的数据

[英]Django display data from two different models

我有两个独立的模型。 一个带有两个文本字段,一个用于多个图像。 现在我想在一个 html div 中显示整个数据。 我必须在项目视图和projects.html 中更改什么?

模型.py

class Project(models.Model):
    title = models.CharField(max_length=200)
    describtion = models.TextField(null=True, blank=True)

class ProjectImage(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    image = models.FileField(upload_to="products/")

表格.py

class ProjectForm(forms.ModelForm):
    class Meta:
        model = Project
        fields = ['title', 'describtion']

class ProjectImageForm(forms.ModelForm):
    class Meta:
        model = ProjectImage
        fields = ['image']
        widgets = {
            'image': ClearableFileInput(attrs={'multiple': True}),
        }

视图.py

def createProject(request):
    form = ProjectForm()
    form2 = ProjectImageForm()

    if request.method == 'POST':
        form = ProjectForm(request.POST)
        form2 = ProjectImageForm(request.POST, request.FILES)
        images = request.FILES.getlist('image')
        if form.is_valid() and form2.is_valid():
            title = form.cleaned_data['title']
            describ = form.cleaned_data['describtion']
            project_instance = Project.objects.create(
                title=title, describtion=describ)
            for i in images:
                ProjectImage.objects.create(project=project_instance, image=i)

    context = {'form': form, 'form2': form2}
    return render(request, 'projects/project_form.html', context)

def projects(request):
    projects = Project.objects.all()
    context = {"projects":projects}
    return render(request, 'projects/projects.html', context)

项目.html

 {% for project in projects %}
          <div class="column">
            <div class="card project">
                <img class="project__thumbnail" src="{{project.image.url}}" alt="project thumbnail" />
                <div class="card__body">
                  <h3>{{project.title}}</h3>
                  <h2>{{project.describtion}}</h2>
                </div>
              </a>
            </div>
          </div>
{% endfor %}

你不需要改变任何东西。

您应该能够使用模板中的project.project_image_set属性访问反向:

<div class="card__body"
  <h3>{{project.title}}</h3>
  <h2>{{project.describtion}}</h2>
  {% for image in project.project_image_set.all %}
     {{ image.image }}
  {% endfor %}
</div>

文档: https ://docs.djangoproject.com/en/4.0/topics/db/examples/many_to_one/

我不太明白这里的问题,但考虑到您在 ProjectImage 中使用外键,我在您的模板中看到了一个问题。 并更新问题

 {% for project in projects %}
          <div class="column">
            <div class="card project">
               {% for j in project.projectimage_set.all %}
                <img class="project__thumbnail" src="{{j.image.url}}" alt="project thumbnail" />
               {% endfor %}
                <div class="card__body">
                  <h3>{{project.title}}</h3>
                  <h2>{{project.describtion}}</h2>
                </div>
              </a>
            </div>
          </div>
{% endfor %}

我会将 FileField 更改为 ImageField 并添加功能:

@property
def get_photo_url(self):
    if self.image and hasattr(self.image, 'url'):
        return self.image.url
    else:
        return ''

如果 createProject 函数有效(我会将其重命名为 create_project),那么在 projects.html 中:

{% for project in projects %}
      <div class="column">
        <div class="card project">
            <div class="card__body">
              <h3>{{project.title}}</h3>
              <h2>{{project.describtion}}</h2>
              {% for img in project.projectimage_set.all %}

            <img class="project__thumbnail" src="{{img.get_photo_url}}" alt="project thumbnail" />
              {% endfor %}
            </div>
          </a>
        </div>
      </div>

{% endfor %}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM