KimGyeongMin-KR
KimGyeongMin-KR

Reputation: 109

Django, why this is not working(reply of comment function)

I want to make reply of comment function. so I added parent option in Answer model. answer_create() working well. but, when i submit reply of comment, url is different with url i setting. i think i should be http://127.0.0.1:8000/debateboard/305/ but return http://127.0.0.1:8000/debateboard/answer/reply/31/ help me plz

models.py

class Question(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='author_question')
    subject = models.CharField(max_length=200)
    content = models.TextField()
    create_date = models.DateTimeField()
    modify_date = models.DateTimeField(null=True, blank=True)
    voter = models.ManyToManyField(User, related_name='voter_question')

    def __str__(self):
        return self.subject

class Answer(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='author_answer')
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    content = models.TextField()
    create_date = models.DateTimeField()
    modify_date = models.DateTimeField(null=True, blank=True)
    voter = models.ManyToManyField(User, related_name='voter_answer')
######### i added this parent to make reply of comment
    parent = models.ForeignKey('self', on_delete=models.CASCADE, blank=True, null=True, related_name='+')

    def __str__(self):
        return self.content

    @property
    def children(self):
        return Answer.objects.filter(parent=self).order_by('-create_date').all()
    
    @property
    def if_parent(self):
        if self.parent is None:
            return True
        return False

urls.py

urlpatterns = [
    path('', base_views.index, name = 'index'),
    path('<int:question_id>/', base_views.detail, name = 'detail'),
    path('answer/create/<int:question_id>/', answer_views.answer_create, name = 'answer_create'),
    path('answer/reply/<int:answer_id>/', answer_views.reply_comment_create , name='reply_comment_create'),

view

def detail(request, question_id):
    # question = Question.objects.get(id = question_id)
    question = get_object_or_404(Question, pk = question_id)
    context = {'question' : question}
    return render(request, 'debateboard/detail.html', context)


@login_required(login_url='common:login')
def reply_comment_create(request, answer_id):
    answer = get_object_or_404(Answer, pk=answer_id)
    # question = get_object_or_404(Question, pk = answer.question.id)
    if request.method == "POST":
        form = AnswerForm(request.POST)
        if form.is_valid():
            sub_answer = form.save(commit=False)
            sub_answer.author = request.user
            sub_answer.create_date = timezone.now()
            sub_answer.parent = answer.id
            sub_answer.save()
            # return redirect('{}#answer_{}'.format(resolve_url('debateboard:detail', question_id = answer.question.id), answer.id))
            return redirect('debateboard:detail', question_id = answer.question.id)
    else:
        return HttpResponseNotAllowed('only post is possible')
    context = {'question' : answer.question, 'form': form}
    return render(request, 'debateboard/detail.html', context)

@login_required(login_url = 'common:login')
def answer_create(request, question_id):
    question = get_object_or_404(Question, pk = question_id)
    # question.answer_set.create(content=request.POST.get('content'), create_date = timezone.now())
    if request.method == 'POST':
        form = AnswerForm(request.POST)
        if form.is_valid():
            answer = form.save(commit=False)
            answer.author = request.user
            answer.create_date = timezone.now()
            answer.question = question
            answer.save()
            # return redirect('debateboard:detail', question_id = question.id)
            return redirect('{}#answer_{}'.format(resolve_url('debateboard:detail', question_id = question.id), answer.id))

    else:
        return HttpResponseNotAllowed('Only POST is possible.')
    context = {'question': question, 'form': form}
    return render(request, 'debateboard/detail.html', context)

html

<!-- for reply of comment -->
<form action="{% url 'debateboard:reply_comment_create' answer.id %}" method="POST">
            {% csrf_token %}
            <div class="form-group">
                <textarea name="reply_comment_{{ answer.id }}" id="reply_comment_{{ answer.id }}" cols="20" rows="5"></textarea>
                <button type="submit">dd</button>
            </div>
        </form>

<!-- for comment-->
<form action="{% url 'debateboard:answer_create' question.id %}" method="post">
        {% csrf_token %}
        <div class="form-group">
            <textarea {% if not user.is_authenticated %}disabled placeholder="로그인후 이용가능" {% endif %} name="content" id="content" cols="30" rows="15"></textarea>
        </div>
        <input {% if not user.is_authenticated %}disabled placeholder="로그인후 이용가능" {% endif %} type="submit" class="btn btn-primary" value="답변등록">
 </form>

Upvotes: 1

Views: 67

Answers (1)

ttt
ttt

Reputation: 300

The address is structured this way because you add an object of class Answer. Anyway, look at how your url is constructed.

path('answer/reply/<int:answer_id>/', answer_views.reply_comment_create , name='reply_comment_create'),

If you want, check the SlugField which can be useful for create custom url.

Upvotes: 1

Related Questions