Django-通用数据,很少查看

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():

我需要你的帮助,因为我有大约6个视图有共同的数据

与我的问题类似的示例:

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)