Django-通用数据,很少查看
我需要你的帮助,因为我有大约6个视图有共同的数据 与我的问题类似的示例:Django-通用数据,很少查看,django,Django,我需要你的帮助,因为我有大约6个视图有共同的数据 与我的问题类似的示例: def informationPlayers(request,nameTeam): try : team = Team.objects.get(name = nameTeam) except Team.DoesNotExist: return redirect(teams) if not request.user.is_authenticated():
def informationPlayers(request,nameTeam):
try :
team = Team.objects.get(name = nameTeam)
except Team.DoesNotExist:
return redirect(teams)
if not request.user.is_authenticated():
formLogin = loginForm(auto_id=False)
countMembers = team.members.count()
else :
members = team.members.members()
... code specific to this view ...
def informationCoach(request,nameTeam):
try :
team = Team.objects.get(name = nameTeam)
except Team.DoesNotExist:
return redirect(teams)
if not request.user.is_authenticated():
formLogin = loginForm(auto_id=False)
countMembers = team.members.count()
else :
members = team.members.members()
... code specific to this view ...
所以这两个视图具有相同的变量和算法(如果用户是否经过身份验证)
我不想在所有视图中使用它们来编写这个算法和变量,我该怎么做呢
我已经尝试使用模板上下文处理器,但它应用于我网站的所有视图/页面,我不希望如此。下面是一个使用类基本视图的答案。Python中的类(以及支持它们的任何其他语言)是共享代码的好方法,同时让任何其他开发人员都清楚哪些视图应该和不应该共享此代码 您的
url.py
应该保持不变,只是需要调用类方法。比如:
from django.conf.urls import *
from .views import *
urlpatterns = [
url(r'^(?P<nameTeam>[^/]+)/player/$', PlayerView.as_view(), name='player_view'),
url(r'^(?P<nameTeam>[^/]+)/coach/$', CoachView.as_view(), name='player_view'),
]
class TeamAccessMixin(object):
# This is really just a regular Python object
team = None
formLogin = None
countMembers = None
members = None
def get_team(self, teamName):
try :
self.team = Team.objects.get(name = nameTeam)
except Team.DoesNotExist:
return redirect(self.teams)
if not self.request.user.is_authenticated():
self.formLogin = loginForm(auto_id=False)
self.countMembers = team.members.count()
else :
self.members = team.members.members()
class PlayerView(TeamAccessMixin, DetailView):
model = Player
template_name = 'team/player.html'
def get_context_data(self, **kwargs):
context = super(PlayerView, self).get_context_data(**kwargs)
self.get_team(kwargs['teamName']);
context['team'] = self.team
context['members'] = self.members
# Special code to add additional context specific to this view
...
return context
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
return super(PlayerView, self).dispatch(request, *args, **kwargs)
class CoachView(TeamAccessMixin, DetailView):
model = Coach
template_name = 'team/coach.html'
def get_context_data(self, **kwargs):
context = super(CoachView, self).get_context_data(**kwargs)
self.get_team(kwargs['teamName']);
context['team'] = self.team
context['members'] = self.members
# Special code to add additional context specific to this view
...
return context
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
return super(CoachView, self).dispatch(request, *args, **kwargs)
只是回答您的具体问题,但我也看到您可能不了解Django的其他方面(如登录装饰器,它将确保您的用户登录或自动重定向他们)。因此,作为一个额外的好处,下面是我将如何实现您正在尝试做的事情(假设您没有指定某些细节):
谢谢@dkarchmer,我做了类似的事情: 修改版本:
这是否合适?如果您对某些视图具有公共函数,那么我建议使用decorators切换到类视图,并使所有这些类都派生自同一个类。否则,只需将公共代码放在函数上,并从每个视图调用它。这只是Python。@dkarchmer,您的方法与Django一起工作??如何将参数“nameTeam”传递给类哦,阿皮索兰基,我会看到的!基于类的视图是实现视图的现代方式,这正是因为Python类在共享代码方面更强大。如果你不介意的话,我可以写一个答案哦,谢谢!:)我将尝试在我的代码中实现这一点,如果可行,我会告诉您;)我有一个问题:你在哪里使用get_团队?如果不亲自测试它,我无法判断它是否有效,但我不会这样做,所以如果它对你有效,那就好了。
class TeamAccessMixin(object):
# This is really just a regular Python object
def get_object(self, queryset=None):
# It is best practice to simply give a 404 if the record does not exist
object = get_object_or_404(Team, slug=self.kwargs['nameTeam'])
return object
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
# the decorator will ensure all users are logged in or will redirect to login page
return super(TeamAccessMixin, self).dispatch(request, *args, **kwargs)
class PlayerView(TeamAccessMixin, DetailView):
model = Player
template_name = 'team/player.html'
def get_context_data(self, **kwargs):
context = super(PlayerView, self).get_context_data(**kwargs)
context['team'] = self.object
context['members'] = self.object.members
# Special code to add additional context specific to this view
...
return context
class CoachView(TeamAccessMixin, DetailView):
model = Player
template_name = 'team/coach.html'
def get_context_data(self, **kwargs):
context = super(CoachView, self).get_context_data(**kwargs)
context['team'] = self.object
context['members'] = self.object.members
# Special code to add additional context specific to this view
...
return context
class ProjetMixin(object) :
project = None
coms = None
form = None
def get_context_data(self, *args, **kwargs) :
context = super(ProjetMixin, self).get_context_data(*args, **kwargs)
try :
self.project = Project.objects.get(name = self.kwargs['name']) #in urls
except Project.DoesNotExist:
return redirect(projects)
self.coms = self.project.coms_set.order_by('-date_send')
if not self.request.user.is_authenticated():
self.form = formForm(auto_id=False)
context['project'] = self.project
context['coms'] = self.coms
context['form'] = self.form
return context
class FicheProjetView(ProjetMixin, TemplateView):
template_name = 'path/homeProject.html'
def get_context_data(self, **kwargs):
context = super(FicheProjetView, self).get_context_data(**kwargs)
if self.request.POST :
...
return context
def dispatch(self, request, *args, **kwargs):
return super(FicheProjetView, self).dispatch(request, *args, **kwargs)