Django form are not showing in html template

Question:

I’m trying to create a form in Django template but it is just not showing the fields

here is my files

models.py where i created the desired table

class ReportMessage(models.Model):
    sender = models.ForeignKey(UserModel, related_name="report_message_sender", on_delete='CASCADE')
    message = models.ForeignKey(Message, on_delete='CASCADE')
    created_at = models.DateTimeField(auto_now=True)
    reason = models.TextField(max_length=1500)
    is_read = models.BooleanField(default=False)

forms.py where i created the form to edit only one field in the table

class ReportMessageForm(forms.Form):
    class Meta:
        model = ReportMessage
        fields = ['reason', ]

views.py where i created the view for the form

@login_required
def report_message(request, pk):
    current_user = request.user
    reported_message = get_object_or_404(Message, pk=pk)
    if request.method == "POST":
        report_message_form = ReportMessageForm(request.POST)
        if report_message_form.is_valid():
            model_instance = report_message_form.save(commit=False)
            model_instance.sender = current_user
            model_instance.message = reported_message
            model_instance.save()
            return redirect('report_confirm')
    else:
        report_message_form = ReportMessageForm()

    context = {
        'report_message_form': report_message_form,
    }
    return render(request, 'fostania_web_app/report_message.html', context)


def report_confirm(request):
    return render(request, 'fostania_web_app/report_confirm.html')

and urls.py where the urls i used for the views

path('report/messages/<int:pk>/', views.report_message, name="report_message"),
path('report/confirm', views.report_confirm, name="report_confirm"),

and finally that is how i used the form in the html template

{% extends 'fostania_web_app/base.html' %}
{% block content %}
{% load static %}
     <form action="" method="post" name="ReportMessageForm" align="right">
         {% csrf_token %}
{{ report_message_form }}
         <input type="submit" class="btn btn-success" style="width: 100px;" value="إرسال" />
     </form>
{% endblock %}

and then all what i see in the html page is the submit button and there is no form labels or input or anything.

Asked By: Ahmed Wagdi

||

Answers:

I think that your problem is in your model form because you are using forms.Form and you need to use forms.ModelForm

class ReportMessageForm(forms.ModelForm):
   class Meta:
      model = ReportMessage
      fields = ['reason', ]
Answered By: Ramiro Uvalle

In your forms.py if you are not using ModelForm then you have to explicitly declare the fields for the forms

reason = forms.Charfield()

Or you can use ModelForm which inherits from the model you specify.

You should specify the model in the Meta class while using ModelForm.You can also specify required fields from the Model in the fields list in Meta class

Class myform(forms.ModelForm)
   Class Meta:
      model = your_model_name
      fields= [reason,]

Cheers
🙂

Answered By: Vivek
def report_confirm(request):
    return render(request, 'fostania_web_app/report_confirm.html', context) #add the context 

You need to pass in the "context" so that it shows in the template

Answered By: Sungananji Sinkamba
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.