Ahmed Wagdi
Ahmed Wagdi

Reputation: 4371

Django form are not showing in html template

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.

Upvotes: 1

Views: 4414

Answers (3)

Sungananji Sinkamba
Sungananji Sinkamba

Reputation: 1

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

Upvotes: 0

user7552123
user7552123

Reputation:

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 :)

Upvotes: 3

Ramiro Uvalle
Ramiro Uvalle

Reputation: 241

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', ]

Upvotes: 2

Related Questions