मैं फंस गया हूँ और समझ में नहीं आता कि यहाँ मेरी समस्या क्यों है:

  • यदि ऑब्जेक्ट्स मौजूद हैं तो मैं संदर्भ वापस करना चाहता हूं और होमपेज पर रीडायरेक्ट करता हूं और त्रुटि ऑब्जेक्ट्स बढ़ाता हूं। DoesNotExist।

यहाँ मेरा कोड:

विचारों

class PageDetail(TemplateView):
    """
    Page View
    """
    template_name = 'page_detail.html'

    def get_context_data(self, **kwargs):
        context = super(PageDetail, self).get_context_data(**kwargs)

        try:
            context['news'] = News.objects.filter(is_active=True).order_by('-date_created')[:4]
        except:
            pass
        try:
            context['page'] = Pages.objects.get(slug=kwargs.get('slug'), is_active=True)
        except Pages.DoesNotExist:
            return redirect('homepage')
        return context

लेकिन मुझे यह त्रुटि मिली:

raise TypeError('context must be a dict rather than %s.' % context.__class__.__name__)
TypeError: context must be a dict rather than HttpResponseRedirect.

मुझे बताएं कि क्या आपको और जानकारी चाहिए

धन्यवाद

0
MOURET Jonas 30 जिंदा 2021, 14:27

2 जवाब

सबसे बढ़िया उत्तर

TemplateView का उपयोग करने के बजाय, मैं एक DetailView का उपयोग करने का सुझाव दूंगा। अतिरिक्त जानकारी (समाचार) पास करने के लिए आप इसी तरह get_context_data() को ओवरराइड कर सकते हैं। 'पेज' को पास करने की कोई आवश्यकता नहीं है क्योंकि यह वही है जो DetailView को आपके लिए करने के लिए डिज़ाइन किया गया है।

फिर आप होम पेज पर रीडायरेक्ट करने के लिए get() को ओवरराइड कर सकते हैं यदि पृष्ठ नहीं मिला है, तो डिफ़ॉल्ट व्यवहार के बजाय जो Http404 त्रुटि उत्पन्न करना है।

उदाहरण के लिए:

def get(self, request, *args, **kwargs):
    try:
        self.object = self.get_object()
    except Http404:
        return redirect('homepage')
    context = self.get_context_data(object=self.object)
    return self.render_to_response(context)

अपडेट करें: आप 'context_object_name' का उपयोग कर सकते हैं, ताकि आप self.object के बजाय अपने टेम्प्लेट में पेज को निम्न प्रकार से देख सकें:

class Page(DetailView):
    model = Pages
    template_name = 'page_detail.html'
    context_object_name = 'page'

पी.एस. ऐसा प्रतीत होता है कि आपके मॉडल को पेज कहा जाता है, इसे पेज कहलाने के लिए और अधिक समझदारी हो सकती है, क्योंकि (मुझे लगता है) प्रत्येक इंस्टेंस एक पेज है।

0
Ffion 30 जिंदा 2021, 15:00

धन्यवाद मैंने आपके समाधान का उपयोग किया है और यदि पृष्ठ सक्रिय है तो संदर्भ वापस करने के लिए कथन जोड़ें अन्यथा मुखपृष्ठ पर रीडायरेक्ट करें।

मेरे विचार में.py

class PageDetail(DetailView):
model = Pages
template_name = 'page_detail.html'
context_object_name = 'page'

def get_context_data(self, **kwargs):
    context = super(PageDetail, self).get_context_data(**kwargs)
    try:
        context['news'] = News.objects.filter(is_active=True).order_by('-date_created')[:4]
    except:
        pass
    return context

def get(self, request, *args, **kwargs):
    try:
        self.object = self.get_object()
    except Http404:
        return redirect('homepage')
    if self.object.is_active:
        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)
    else:
        return redirect('homepage')
0
MOURET Jonas 30 जिंदा 2021, 17:23