2017-04-07 61 views
0

我想调用的最后一个函数在此代码(DEF get_level_msg():)调用从Django的HTML模板

class ProductDetailView(ProductView): 
model = EnrollableTemplate 

@functional.cached_property 
def location(self): 
    return get_object_or_404(
     Location.actives, slug=self.kwargs['location_slug']) 

def get_object(self): 
    return get_object_or_404(
     EnrollableTemplate, slug=self.kwargs['product_slug']) 

def get_template_names(self): 
    if self.get_object().category.language: 
     return 'pdp_language.html' 
    return 'immersion_pdp.html' 

def get_faqs(self): 
    object = self.get_object() 
    if object.is_workshop: 
     return c.faqs['workshop'] 
    elif object.category.language: 
     return c.faqs['language'] 
    else: 
     return c.faqs['immersion'] 

def get_context_data(self, **kwargs): 
    context = super().get_context_data(**kwargs) 
    template = kwargs[self.context_object_name] 

    # only display upcoming classes that have open seats available 
    courses = (template.enrollable_set 
       .upcoming() 
       .select_related('template', 'venue__location') 
       .filter(venue__location=self.location) 
       .order_by('start_date')) 

    loc_filter = self.request.GET.get('neighborhood') 
    context['language'] = language = template.category.language 

    if not self.object.is_workshop: 
     sessions = [enrollable.session_count for enrollable 
        in self.object.enrollable_set.upcoming()] 
     if sessions: 
      context['max_sessions'] = max(sessions) 

    neighborhoods = (Venue.objects.filter(location=self.location) 
            .filter(enrollable__in=courses) 
            .distinct() 
            .values_list('neighborhood', flat=True)) 
    if loc_filter: 
     courses = courses.filter(course__venue__neighborhood=loc_filter) 
     context['filtered'] = True 

    location_filters = [('?neighborhood={}'.format(n), n) for 
         n in neighborhoods.iterator()] 
    path = urlparse(self.request.get_full_path()).path 
    location_filters.insert(0, ('{}#filter'.format(path), "all")) 
    context['filters'] = [('Location', location_filters)] 

    if language: 
     context['featured_teachers'] = self.get_featured_teachers(
      self.location, language) 
    else: 
     try: 
      context['featured_teachers'] = [courses[0].teacher] 
     except IndexError: 
      context['featured_teachers'] = None 

    context['expectations'] = template.expectation_set.all() 
    context['faqs'] = self.get_faqs() 
    context['courses'] = courses 
    context['template_id'] = template.id 
    # import ipdb; ipdb.set_trace() 
    if courses.exists(): 
     course = courses[0] 
     days_per_week = sum(1 for x in course.schedule if x is True) 
     if days_per_week == 1: 
      days_per_week = 'once' 
     elif days_per_week == 2: 
      days_per_week = 'twice' 
     else: 
      days_per_week = 'every day' 
     context['days_per_week'] = days_per_week 


    weeks = (course.start_date - course.end_date).days 
    context['weeks_per_course'] = abs(int(weeks/7)) 
    context['has_book'] = course.template.books.count() > 0 
    context['first_start_date'] = course.start_date 
    context['hello'] = template.level 
    level_message1 = "Beginner Course" 
    level_message2 = "Intermediate Course" 
    level_message3 = "Advanced Course" 
    level_message4 = "Beginner Intensive" 

    # context['get_level_msg'] = 
    def get_level_msg(): 
     if template.level == 1: 
      return level_message1 
     elif template.level == 2: 
      return level_message1 
     elif template.level == 3: 
      return level_message1 
     elif template.level == 4: 
      return level_message2 
     elif template.level == 5: 
      return level_message2 
     elif template.level > 5: 
      return level_message3 
     else: 
      return level_message4 

到使用这个HTML模板

<h4 class="t2">{{ weeks_per_course }} WEEK {{ ProductDetailView.get_level_msg }}<!-- BEGINNER INTENSIVE --></h4> 

Django视图功能我在网上找到的例子,它说我应该首先使用模型,在这种情况下,它的ProductDetailView。我进入Django的3天,仍然不明白如何做到这一点!有人能帮我得出结论吗?谢谢!

+1

这个问题有点混乱。 ProductDetailView听起来像一个视图,而不是一个模型。代码*完全*在哪里?这个函数里面的'template'在哪里? –

+0

另外,什么是'模板'和'template.level'? – Chris

+2

[模板标签](https://docs.djangoproject.com/zh/1.10/howto/custom-template-tags/)可能对您有所了解。 –

回答

0

我不明白你为什么想要一个函数,或者你为什么希望从模板中调用它。该值仅取决于get_context_data内的另一个值;您应该在该方法中使用基本的if语句。现在

... 
level_message1 = "Beginner Course" 
level_message2 = "Intermediate Course" 
level_message3 = "Advanced Course" 
level_message4 = "Beginner Intensive" 

if template.level == 1: 
    lvl = level_message1 
elif template.level == 2: 
    lvl = level_message1 
elif template.level == 3: 
    lvl = level_message1 
elif template.level == 4: 
    lvl = level_message2 
elif template.level == 5: 
    lvl = level_message2 
elif template.level > 5: 
    lvl = level_message3 
else: 
    lvl = level_message4 

context['get_level_msg'] = lvl 

你可以参考{{ get_level_msg }}直接在你的模板,就像你与任何其他值做。

(我怀疑template实际上是你所期望的,甚至是目前在所有,虽然,我怀疑你应该使用self.object

+0

当我调用上下文['级'] = template.level在视图它给了我我的期待!这就是为什么当我打电话给{{get_level_msg}}时它令人困惑,它渲染了不良模板变量:%s –

+0

好吧,你已经将键设置为“level”而不是“get_level_msg”。 –

0

我意识到我没有正确处理这个问题,这是我并解决它:

t_level = template.level 

    if t_level == 1: 
      t_level = level_message1 
    elif t_level == 2: 
      t_level = level_message1 
    elif template.level == 3: 
      t_level = level_message1 
    elif template.level == 4: 
      t_level = level_message2 
    elif template.level == 5: 
      t_level = level_message2 
    elif template.level == 6: 
      t_level = level_message3 
    elif template.level == 7: 
      t_level = level_message3 
    else: 
      t_level = level_message4 
    context['t_level'] = t_level 

我正在这样的功能,而事实上,这是没有必要的,所以我重写了它,所以我将能够将其与上下文调用到我的模板

<h4 class="t2">{{ weeks_per_course }} WEEK {{ t_level }}</h4>