मैं वर्तमान में एक Django साइट के साथ एक अजीब समस्या डीबग कर रहा हूं जहां एक विशिष्ट मॉडल एक नया उदाहरण बनाते समय या व्यवस्थापक इंटरफ़ेस में किसी मौजूदा को संपादित करते समय 404 त्रुटि ट्रिगर कर रहा है।

विशेष रूप से, त्रुटि तब होती है जब प्रपत्र सबमिट किया जाता है। मैं GET चेंजफॉर्म को ठीक कर सकता हूं।

यह केवल लाइव साइट पर हो रहा है और केवल इस मॉडल को सहेजते समय। अन्य सभी मॉडल अपेक्षित व्यवहार करते हैं, और जब मैं इसे स्थानीय रूप से चलाता हूं, तो सब कुछ अपेक्षा के अनुरूप काम करता है। जब प्रोग्रामिक रूप से बनाया जाता है, तो सब कुछ लाइव और स्थानीय रूप से भी ठीक होता है।

यहाँ मेरा मॉडल है:

class Content(models.Model):
    """Base Content class."""
    title = models.CharField(max_length=200)
    body = RichTextUploadingField(max_length=30000, blank=True, null=True, config_name='admin')
    date_created = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)
    author = models.ForeignKey(to=User, on_delete=models.CASCADE)
    slug = models.SlugField(max_length=100, null=True, default=None)

    class Meta:
        abstract = True


class ContentPage(Content):
    """Represents a page of generic text content."""
    title = models.CharField(max_length=200, unique=True)
    has_url = models.BooleanField(default=False, help_text='Sets the page to accessible via a URL.')
    banner = models.ImageField(upload_to='myfiles/banners/', blank=True, null=True)

    def save(self, *args, **kwargs):
        """Create the slug from the title."""
        self.slug = slugify(self.title[:100])
        super(ContentPage, self).save(*args, **kwargs)

ContentPage वह वर्ग है जो व्यवस्थापक इंटरफ़ेस में समस्या को ट्रिगर करता है। मेरी दूसरी कक्षा जो Content से विरासत में मिली है, ठीक काम करती है।

मैंने अपने व्यवस्थापक सेटअप को निम्नलिखित पर वापस ले लिया है और यह अभी भी हो रहा है:

class CustomAdminSite(AdminSite):

    def get_urls(self):
        """Define custom admin URLs."""
        urls = super(CustomAdminSite, self).get_urls()

        # Append some new views here...

        return urls


admin_site = CustomAdminSite()
admin_site.register(ContentPage)

यहां एक बुनियादी यूआरएल कॉन्फ़िगरेशन है जो समस्या को पुन: उत्पन्न करता है:

from myapp.admin import admin_site


urlpatterns = [
    path('mycooladminsite/', admin_site.urls),
    path('', include('myapp.urls')),
]

कुछ अन्य चीजें जिन्हें मैंने जांचा है:

  • मेरे पास सेव के साथ हस्तक्षेप करने वाला कोई संकेत नहीं है।
  • मैं मॉडल की save() पद्धति में कोई क्रिया नहीं कर रहा हूं।
  • मैंने get_object_or_404() कॉल की जांच की है और मुझे ऐसा कोई कॉल नहीं दिख रहा है जो इसे प्रभावित करे।

मैंने इसके माध्यम से खुदाई करने में कुछ घंटे बिताए हैं और मैं वर्तमान में एक ईंट की दीवार पर हूं।

डेटाबेस इंजन mysql.connector.django है, Django संस्करण 2.2.11 के साथ। मैं अभी तक इस साइट के लिए इंजन नहीं बदल सकता या Django को 3.x में अपडेट नहीं कर सकता।

यह एक हालिया समस्या है जिसे मैंने पहले नोटिस नहीं किया था।

अद्यतन:

मैंने समस्या को ImageField तक सीमित कर दिया है। जब मैं इसे प्रदर्शित फ़ील्ड से हटा देता हूं, तो समस्या सहेजने पर नहीं होती है।

मैं एक कस्टम व्यवस्थापक प्रपत्र का उपयोग कर रहा हूं, लेकिन यह समस्या प्रतीत नहीं होती है। मैंने डिफ़ॉल्ट का उपयोग करने का प्रयास किया है और यह अभी भी होता है। मैं स्टोरेज क्लास में अपवाद ढूंढ रहा हूं लेकिन मुझे कोई नहीं मिला है। मैंने इसे सभी तरह से वापस ले लिया और त्रुटि बनी हुई है।

मैंने फ़ायरफ़ॉक्स डेवलपर टूल्स में स्थानीय 302 POST और उत्पादन 404 POST की जांच की है और वे लगभग समान हैं लेकिन उत्पादन सर्वर अपाचे है और x-powered-by फ़्यूज़न पैसेंजर है, जबकि स्थानीय रूप से सर्वर है WSGIServer/0.2 CPython/3.7.3.

मैंने वास्तव में उत्पादन में अन्य multipart/form-data रूपों के साथ होने वाले 404 को देखा है, जो मुझे पहले कभी नहीं मिला।

5
alstr 8 जुलाई 2020, 17:08

2 जवाब

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

मैं इसकी तह तक कभी नहीं गया, लेकिन मैंने कम से कम प्रपत्रों को सही ढंग से काम करने की अनुमति देने के लिए एक समाधान तैयार किया, जैसा कि मैंने my में चर्चा की थी। संबंधित प्रश्न का उत्तर:

  1. _get_response(self, request) को django.core.handlers.base में संपादित करें। resolver_match = resolver.resolve(request.path_info) को में बदलें resolver_match = resolver.resolve(request.path).

  2. इस मिडलवेयर को जोड़ें (अपनी सटीक आवश्यकताओं के अनुसार समायोजित करें):

     क्लास ImageField404Middleware:       def __init__ (स्वयं, get_response):           self.get_response = get_response        def __call__ (स्वयं, अनुरोध):           प्रतिक्रिया = self.get_response (अनुरोध)            अगर (request.method == 'POST' और request.user.is_superuser और response.status_code == 302                   और request.get_full_path().startswith('/pathtoadmin/')):               post_messages = get_messages (अनुरोध)               post_messages में संदेश के लिए:                   अगर (Message.message में 'सफलतापूर्वक जोड़ा गया' या 'Message.message' में 'सफलतापूर्वक बदला गया')                           और संदेश.स्तर == message_levels.SUCCESS):                       संदेश.सफलता (अनुरोध, संदेश.संदेश)                       रीडायरेक्ट_यूआरएल = request.get_full_path ()                       अगर अनुरोध में '_addanother'। पोस्ट:                           redirect_url = re.sub(r'[^/]*/[^/]*/$', 'add/', redirect_url)                       अनुरोध में elif '_save'। पोस्ट:                           redirect_url = re.sub(r'[^/]*/[^/]*/$', '', redirect_url)                       वापसी HttpResponseRedirect (redirect_url)            वापसी प्रतिक्रिया  

किसी भी तरह से आदर्श नहीं है, लेकिन इस समय मेरे लिए काम करता है।

आप यहां अधिक विवरण पढ़ सकते हैं: https://medium.com/@ mnydigital/how-to-resolve-django-admin-404-post-error-966ce0dcd39d

0
alstr 28 जुलाई 2020, 11:13

मुझे नहीं पता कि समस्या क्या है, लेकिन अगर आपके पास लॉग नहीं हैं, तो इसे DEBUG=False के साथ प्रोड पर चलाएं, संतरी आदि का उपयोग न करें और यह तभी होता है जब आप ContentPage व्यवस्थापक फॉर्म को सहेजते हैं, फिर आप अपने ModelAdmin में save_new या save_model विधि को ओवरराइट कर सकते हैं


    def save_model(self, request, obj, form, change):
        try:
            obj.save()
        except Exception:
            logging.exception("blah")

(या save_new तदनुसार)

और लॉग की जाँच करें।

या सिर्फ संतरी का प्रयोग करें। उनके पास एक स्वतंत्र स्तर है

0
Tom Wojcik 8 जुलाई 2020, 19:03