根据url的父ID显示子记录
我有一个模型数据集
,另一个称为datasetReview
,其中datasetReview
具有与dataset
的外键连接。我想在单独的页面中显示与特定dataset
相关的所有datasetReview
模型。
我当前可以查看每个dataset
喜欢:http://127.0.0.1:8000/dataset/3/
,并希望查看所有datasetReview <<<<<<<
/code> 数据集
3喜欢:http://127.0.0.1:8000/dataset/3/reviews
,但我不确定如何设置此设置。
我不确定该如何表达这个问题,所以我很难找到其他帖子讨论如何做这样的事情。这是我的代码:
urls.py
:
from django.urls import path
from .views import (
DatasetListView,
DatasetDetailView,
DatasetCreateView,
DatasetUpdateView,
DatasetDeleteView,
DatasetReviewsView
)
from . import views
urlpatterns = [
path('', DatasetListView.as_view(), name='argo-home'),
path('dataset/<int:pk>/', DatasetDetailView.as_view(), name='dataset-detail'),
path('dataset/new/', DatasetCreateView.as_view(), name='dataset-create'),
path('dataset/<int:pk>/update', DatasetUpdateView.as_view(), name='dataset-update'),
path('dataset/<int:pk>/delete', DatasetDeleteView.as_view(), name='dataset-delete'),
path('dataset/<int:pk>/reviews', DatasetReviewsView.as_view(), name='dataset-review'),
path('about/', views.about, name='argo-about'),
]
views.py
:
from django.shortcuts import render
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.views.generic import (
ListView,
DetailView,
CreateView,
UpdateView,
DeleteView
)
from .models import Dataset, DatasetReview
def home(request):
context = {
'datasets' : Dataset.objects.all(),
}
return render(request, 'argo/home.html', context)
class DatasetListView(ListView):
model = Dataset
template_name = 'argo/home.html' # <app>/<model>_<viewtype>.html
context_object_name = 'datasets'
ordering = ['-date_posted']
class DatasetDetailView(DetailView):
model = Dataset
class DatasetCreateView(LoginRequiredMixin, CreateView):
model = Dataset
fields = ['title', 'description', 'access']
def form_valid(self, form):
form.instance.author = self.request.user
form.instance.affiliation = self.request.user.affiliation
return super().form_valid(form)
class DatasetUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Dataset
fields = ['title', 'description']
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
def test_func(self):
Dataset = self.get_object()
if self.request.user == Dataset.author:
return True
return False
class DatasetDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
model = Dataset
success_url = '/'
def test_func(self):
dataset = self.get_object()
if self.request.user == dataset.author:
return True
return False
class DatasetReviewsView(DetailView):
model = DatasetReview
success_url = '/'
def test_func(self):
datasetReview = self.get_object()
if self.request.user == datasetReview.author:
return True
return False
def about(request):
return render(request, 'argo/about.html', {'title': 'About'})
models.py
:
from django.db import models
from django.utils import timezone
from django.core.validators import MaxValueValidator, MinValueValidator
from django.urls import reverse
from users.models import User, Affiliation
# from django.contrib.auth.models import User
class Dataset(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
affiliation = models.ForeignKey(Affiliation, on_delete=models.CASCADE, related_name='posted_datasets')
access = models.ManyToManyField(Affiliation, related_name='available_datasets')
author = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('dataset-detail', kwargs={'pk' : self.pk})
class DatasetReview(models.Model):
dataset = models.ForeignKey(Dataset, on_delete=models.CASCADE, related_name='reviews_obj')
reviewer = models.ForeignKey(User, on_delete=models.CASCADE, related_name='reviews')
comments = models.TextField()
rating = models.FloatField(
default=3.0,
validators=[MaxValueValidator(5.0), MinValueValidator(1.0)]
)
def __str__(self):
return self.dataset.title + ' review by ' + self.reviewer.username
def get_absolute_url(self):
return reverse('dataset-review', kwargs={'rpk' : self.pk})
admin.py.py
:
from django.contrib import admin
from .models import Dataset, DatasetReview
admin.site.register(Dataset)
admin.site.register(DatasetReview)
任何提示将非常有帮助,对Django非常新。
I have one model Dataset
and another one called DatasetReview
, where DatasetReview
has a foreign key connection to Dataset
. I would like to display all of the DatasetReview
models that are tied to a specific Dataset
in a separate page.
I can currently view each Dataset
like so: http://127.0.0.1:8000/dataset/3/
and would like to see all of the DatasetReview
models for Dataset
3 like so: http://127.0.0.1:8000/dataset/3/reviews
But I am unsure how to set this up.
I am not sure how to phrase this question well so I had difficulty finding other posts discussing how to do something like this. Here is my code:
urls.py
:
from django.urls import path
from .views import (
DatasetListView,
DatasetDetailView,
DatasetCreateView,
DatasetUpdateView,
DatasetDeleteView,
DatasetReviewsView
)
from . import views
urlpatterns = [
path('', DatasetListView.as_view(), name='argo-home'),
path('dataset/<int:pk>/', DatasetDetailView.as_view(), name='dataset-detail'),
path('dataset/new/', DatasetCreateView.as_view(), name='dataset-create'),
path('dataset/<int:pk>/update', DatasetUpdateView.as_view(), name='dataset-update'),
path('dataset/<int:pk>/delete', DatasetDeleteView.as_view(), name='dataset-delete'),
path('dataset/<int:pk>/reviews', DatasetReviewsView.as_view(), name='dataset-review'),
path('about/', views.about, name='argo-about'),
]
views.py
:
from django.shortcuts import render
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.views.generic import (
ListView,
DetailView,
CreateView,
UpdateView,
DeleteView
)
from .models import Dataset, DatasetReview
def home(request):
context = {
'datasets' : Dataset.objects.all(),
}
return render(request, 'argo/home.html', context)
class DatasetListView(ListView):
model = Dataset
template_name = 'argo/home.html' # <app>/<model>_<viewtype>.html
context_object_name = 'datasets'
ordering = ['-date_posted']
class DatasetDetailView(DetailView):
model = Dataset
class DatasetCreateView(LoginRequiredMixin, CreateView):
model = Dataset
fields = ['title', 'description', 'access']
def form_valid(self, form):
form.instance.author = self.request.user
form.instance.affiliation = self.request.user.affiliation
return super().form_valid(form)
class DatasetUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Dataset
fields = ['title', 'description']
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
def test_func(self):
Dataset = self.get_object()
if self.request.user == Dataset.author:
return True
return False
class DatasetDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
model = Dataset
success_url = '/'
def test_func(self):
dataset = self.get_object()
if self.request.user == dataset.author:
return True
return False
class DatasetReviewsView(DetailView):
model = DatasetReview
success_url = '/'
def test_func(self):
datasetReview = self.get_object()
if self.request.user == datasetReview.author:
return True
return False
def about(request):
return render(request, 'argo/about.html', {'title': 'About'})
models.py
:
from django.db import models
from django.utils import timezone
from django.core.validators import MaxValueValidator, MinValueValidator
from django.urls import reverse
from users.models import User, Affiliation
# from django.contrib.auth.models import User
class Dataset(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
affiliation = models.ForeignKey(Affiliation, on_delete=models.CASCADE, related_name='posted_datasets')
access = models.ManyToManyField(Affiliation, related_name='available_datasets')
author = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('dataset-detail', kwargs={'pk' : self.pk})
class DatasetReview(models.Model):
dataset = models.ForeignKey(Dataset, on_delete=models.CASCADE, related_name='reviews_obj')
reviewer = models.ForeignKey(User, on_delete=models.CASCADE, related_name='reviews')
comments = models.TextField()
rating = models.FloatField(
default=3.0,
validators=[MaxValueValidator(5.0), MinValueValidator(1.0)]
)
def __str__(self):
return self.dataset.title + ' review by ' + self.reviewer.username
def get_absolute_url(self):
return reverse('dataset-review', kwargs={'rpk' : self.pk})
admin.py
:
from django.contrib import admin
from .models import Dataset, DatasetReview
admin.site.register(Dataset)
admin.site.register(DatasetReview)
Any tips would be super helpful, very new to django.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
弄清楚了。
键在
类DataSetReviewSview(lidetview)
inviews.pys.py
中。我首先需要将此继承更改为listView
以启用我想要的东西。接下来,我只需要为我想在HTML页面中显示的内容提供上下文。通过覆盖
get_context_data
函数,这很容易完成,该功能为显示基于此类视图的模板提供了上下文数据。它非常容易利用Python提供我想要的信息。我可以查询我正在查看的数据集的ID,并使用
id = self.kwargs ['pk']
(必须包含在get_context_data
的函数参数中),然后,我只能将所有评论过滤到与此ID匹配的数据集的人。在HTML中,我可以在变量num_reviews
上迭代。还有其他一些代码平均所有评分也提供了总体评级。
Figured this out.
The key is within
class DatasetReviewsView(DetailView)
inviews.py
. I first needed to change this inheritance to aListView
to enable what I was looking for.Next, I just needed to provide context for what I wanted to show in my html page. This is easily done by overriding the
get_context_data
function, which provides the context data for templates displaying this class based view.It makes it very easy to leverage python to provide the information I want. I could query the id of the dataset I was looking at with
id = self.kwargs['pk']
(which must be included in the function parameters forget_context_data
), and then I could just filter all reviews to just those with a dataset matching this id. Within the html I could then iterate over the variablenum_reviews
.There is some other code that averages all the ratings to provide an overall rating as well.