मैं Django में एक पोस्ट पर टिप्पणियां पोस्ट करने का प्रयास कर रहा हूं, लेकिन मेरा फॉर्म कभी मान्य नहीं होता है। मैंने पाया है कि ऐसा इसलिए है क्योंकि मेरी request.method हमेशा एक GET है और एक पोस्ट नहीं है। मैं एक उपयोगकर्ता को एक नई टिप्पणी जोड़ने की अनुमति देना चाहता हूं और इसे स्वचालित रूप से डेटाबेस में सहेजना चाहता हूं और मेरी पोस्ट के विवरण दृश्य पर प्रदर्शित करना चाहता हूं।

View.py

def add_comment_to_post(request, pk):
    print("REQUEST METHOD", request.method)
    post = get_object_or_404(Post, pk=pk)
    if request.method == "POST":
        print("POST")
        print(request.POST)
        form = CommentForm(request.POST)
        if form.is_valid():
            print("HREE")
            comment = form.save(commit=False)
            comment.author = request.user
            comment.date_posted = timezone.now()
            comment.post = post
            comment.save()
            return redirect('post_detail', pk=comment.post.pk)
    else:
        print("ELSE")
        form = CommentForm()

    # Note the indentation (this code will be executed both if NOT POST
    # and if form is not valid.
    return render(request, 'main/add_comment_to_post.html', {'form': form, 'post':post})

Form.py

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['author', 'content']

Model.py

class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    comment_id = models.AutoField(primary_key=True)
    author = models.ForeignKey(Profile, on_delete=models.CASCADE)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    # approved_comment = models.BooleanField(default=False)

    def approve(self):
        self.approved_comment = True
        self.save()

    class Meta:
        ordering = ['date_posted']

    def __str__(self):
        return 'Comment {} by {}'.format(self.content, self.author.first_name)

class Post(models.Model):
    run_id = models.AutoField(primary_key=True)
    author = models.ForeignKey(Profile, on_delete=models.CASCADE)
    title = models.TextField(max_length=100, blank=False, default="title holder.")
    distance = models.FloatField(default=0.0, blank=False)
    time = models.IntegerField(default=0, blank=False)
    date_posted = models.DateTimeField(default=timezone.now)
    location = models.TextField(max_length=100, blank=False, default="")
    image = models.TextField(max_length=250, blank=True)
    content = models.TextField(max_length=1000, blank=True, default="")

    @property
    def pace(self):
        if self.distance == 0.0:
            return 0.0
        return round(self.time / self.distance, 2)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk': self.pk})

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

Urls.py

urlpatterns = [
    # path('', views.home, name="main-home"),
    path('', PostListView.as_view(), name="main-home"),
    path('admin/', admin.site.urls),
    path('register/', views.register, name="register"),
    path('post/<int:pk>/', PostDetailView.as_view(), name='post-detail'),
    path('post/new/', PostCreateView.as_view(), name='post-create'),
    path('post/<int:pk>/update/', PostUpdateView.as_view(), name='post-update'),
    path('post/<int:pk>/delete/', PostDeleteView.as_view(), name='post-delete'),
    path('about/', views.about, name="main-about"),
    path('search/', SearchResultsView.as_view(), name="main-search"),
    path('post/<int:pk>/comment/', views.add_comment_to_post, name='add_comment_to_post'),
]

Add_comment_to_post.html

{% extends "main/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
    <h1>New comment</h1>

    <form action="" method="POST">
        {% csrf_token %}
        <fieldset class="form-group">
            <legend class="border-bottom mb-4">New Comment</legend>
            {{ form|crispy }}
        </fieldset>
        <div class="form-group">
            <a class="btn btn-outline-info" type="submit" href="{% url 'post-detail' pk=post.pk %}">Send</a>
        </div>
    </form>
{% endblock %}

मैंने क्या प्रयास किया है जांचें कि यह किस प्रकार का अनुरोध है और इसे संभाल रहा है

अन्य समान पोस्ट खोजने से कोई फायदा नहीं हुआ

दृश्य समारोह बदलना

किसी भी सहायता की सराहना की जाएगी।

0
Parker Mitchell 26 फरवरी 2020, 22:21
अनुरोध हमेशा GET क्यों होता है? प्रपत्र एक पोस्ट प्रतीत होता है।
 – 
schillingt
26 फरवरी 2020, 22:26
मुझे नहीं पता, लेकिन जब मैं प्रिंट करता हूं तो यह कह रहा है कि अनुरोध विधि प्राप्त है
 – 
Parker Mitchell
26 फरवरी 2020, 22:31
आप निम्नलिखित की जांच कर सकते हैं: कार्रवाई पोस्ट है सत्यापित करने के लिए एचटीएमएल फॉर्म का निरीक्षण करें, कुछ ब्राउज़र डेवलपर टूल के नेटवर्क पैनल का निरीक्षण करें ताकि यह सत्यापित किया जा सके कि सही पोस्ट भेजा जा रहा है।
 – 
schillingt
26 फरवरी 2020, 22:43

2 जवाब

आपने if form.is_valid(): कथन के लिए अन्य राज्य को परिभाषित नहीं किया है। इसलिए, यदि आपके प्रपत्र में त्रुटियाँ हैं, तो अपना टेम्पलेट फिर से प्रस्तुत करें देखें।

0
kamilyrb 26 फरवरी 2020, 22:25
ठीक है, मैं कभी भी अगर कथन तक नहीं पहुंच रहा हूं क्योंकि मैं समारोह में पहले बयान से पहले नहीं मिलता हूं।
 – 
Parker Mitchell
26 फरवरी 2020, 22:30
अगर अनुरोध। विधि == "पोस्ट": यह कथन हमेशा गलत है, है ना?
 – 
kamilyrb
26 फरवरी 2020, 22:32
हाँ यह हमेशा गलत होता है। request.method हमेशा GET . होता है
 – 
Parker Mitchell
26 फरवरी 2020, 22:36
मैंने इसे इस तरह बदल दिया कि कोई फायदा नहीं हुआ। मेरे पास href है ताकि जब उपयोगकर्ता सबमिट हिट करता है तो उन्हें उस पोस्ट पर वापस भेज दिया जाता है जिस पर उन्होंने टिप्पणी की थी: <form action="{% url 'post-detail' pk=post.pk %}" method="POST"> {% csrf_token %} <fieldset class="form-group"> <legend class="border-bottom mb-4">New Comment</legend> {{ form|crispy }} </fieldset> <div class="form-group"> <a class="btn btn-outline-info" type="submit">Send</a> </div> </form>
 – 
Parker Mitchell
26 फरवरी 2020, 22:51
        <div class="form-group">
            <a class="btn btn-outline-info" type="submit" href="{% url 'post-detail' pk=post.pk %}">Send</a>
        </div>

आपकी समस्या यह है कि यह एक लिंक है और वास्तव में एक फॉर्म सबमिट नहीं है। उस लिंक को एक साधारण <input type="submit" value="Send"> से बदलने का प्रयास करें।

0
Tim Tisdall 26 फरवरी 2020, 23:06
मैंने समायोजन कर लिया है, लेकिन अब मुझे एक Method Not Allowed (POST): /post/3/ Method Not Allowed: /post/3/ [26/Feb/2020 21:23:32] "POST /post/3/ HTTP/1.1" 405 0 त्रुटि मिल रही है
 – 
Parker Mitchell
27 फरवरी 2020, 00:24
यह सुनिश्चित करने के लिए कि यह सही URL पर जा रहा है, <form action="{% url 'add_comment_to_post' pk=post.pk %}" method="POST"> का उपयोग करने के लिए टेम्प्लेट को बदलने का प्रयास करें।
 – 
Tim Tisdall
27 फरवरी 2020, 22:19