Garrett
Garrett

Reputation: 1792

Getting forms to display in HTML with Django

so I've gotten forms to display correctly before, I'm just a little lost as to why I am using certain words when doing so, and I'm wondering why I've used different words to get different forms to display.

In this first example (colorist_form.html) I am using {{ form }} which does get the form to display

{% extends "base.html" %}

{% block content %}
    <div class="colorset-base">
        <h2>Create new post</h2>
        <p class="hint">Add hex codes for each color you would like to include.</p>
        <form id="postForm" action="{% url 'colorsets:new_color' %}" method="POST">
            {% csrf_token %}
            {{ form }}
            <button type="submit" class="submit btn btn-primary btn-large">Add Color Set</button>
        </form>
    </div>
{% endblock %}

However, in this example (widget_form.html) I am using the same {{ form }} but now the form does not display

{% block content %}
    <div class="colorset-base">
        <h2>Create new widget</h2>
        <form id="postForm" action="{% url 'adminpanel:create-widget' %}" method="POST">
            {% csrf_token %}
            {{ form }}
            <button type="submit" class="submit btn btn-primary btn-large">Add Widget</button>
        </form>
    </div>
{% endblock %}

Also in my register.html I am using {{ user_form }} which does get the form to display.

{% extends "base.html" %}

{% block content %}

<div class="form-base">
    {% if registered %}
        <h1>Thank you for registering!</h1>
    {% else %}
        <h2>Register</h2>
        <form method="POST">
            {% csrf_token %}
            {{ user_form }}
            <input type="submit" value="Register" />
        </form>
    {% endif %}
</div>

{% endblock %}

Why do I use the keyword "form" vs some other word such as "user_form" or "widget_form"? And why won't the widget_form.html display the form?

Here is my code for the forms and views respectively:

adminpanel app views.py:

from django.shortcuts import render
from adminpanel.forms import WidgetForm
from adminpanel.models import Widget
from django.utils import timezone

from django.contrib.auth import authenticate,login,logout
from django.http import HttpResponseRedirect, HttpResponse
from django.core.urlresolvers import reverse,reverse_lazy
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from braces.views import SelectRelatedMixin
from django.views.generic import (TemplateView,ListView,
                                    DetailView,CreateView,
                                    UpdateView,DeleteView)

# Create your views here.
class CreateWidgetView(LoginRequiredMixin,CreateView):
    login_url = '/login/'
    redirect_field_name = 'index.html'
    form_class = WidgetForm
    model = Widget

    def form_valid(self,form):
        self.object = form.save(commit=False)
        self.object.save()
        return super().form_valid(form)

class SettingsListView(ListView):
    model = Widget

    def get_query(self):
        return Widget.object.filter(order_by('widget_order'))

class DeleteWidget(LoginRequiredMixin,SelectRelatedMixin,DeleteView):
    model = Widget
    select_related = ('Widget',)
    success_url = reverse_lazy('settings')

    def get_queryset(self):
        queryset = super().get_query()
        return queryset.filter(user_id=self.request.user.id)

    def delete(self):
        return super().delete(*args,**kwargs)

colorsets app views.py:

from django.shortcuts import render
from colorsets.forms import ColorForm
from colorsets import models
from colorsets.models import ColorSet
from django.utils import timezone

from django.contrib.auth import authenticate,login,logout
from django.http import HttpResponseRedirect, HttpResponse
from django.core.urlresolvers import reverse,reverse_lazy
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
from braces.views import SelectRelatedMixin
from django.views.generic import (TemplateView,ListView,
                                    DetailView,CreateView,
                                    UpdateView,DeleteView)

# Create your views here.
#def index(request):
#   return render(request,'index.html')

class PostListView(ListView):
    model = ColorSet

    def get_queryset(self):
        return ColorSet.objects.filter(published_date__lte=timezone.now()).order_by('-published_date')

class CreateColorSetView(LoginRequiredMixin,CreateView):
    login_url = '/login/'
    redirect_field_name = 'index.html'
    form_class = ColorForm
    model = ColorSet

    def form_valid(self,form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.save()
        return super().form_valid(form)

class DeletePost(LoginRequiredMixin,SelectRelatedMixin,DeleteView):
    model = models.ColorSet
    select_related = ('user',)
    success_url = reverse_lazy('index')

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(user_id=self.request.user.id)

    def delete(self,*args,**kwargs):
        return super().delete(*args,**kwargs)

adminpanel app forms.py:

from django import forms
from adminpanel.models import Widget

class WidgetForm(forms.ModelForm):
    class Meta():
        model = Widget
        fields = ('name','widget_order','body')

        widgets = {
            'name':forms.TextInput(attrs={'class':'text-input'}),
            'body':forms.Textarea(attrs={'class':'text-area'}),
        }

colorsets app forms.py:

from django import forms
from colorsets.models import ColorSet

class ColorForm(forms.ModelForm):
    class Meta():
        model = ColorSet
        fields = ('name','color_one','color_two','color_three','color_four','color_five')

        widgets = {
            'name':forms.TextInput(attrs={'class':'colorset-name'}),
            'color_one':forms.TextInput(attrs={'class':'colorset-color'}),
            'color_two':forms.TextInput(attrs={'class':'colorset-color'}),
            'color_three':forms.TextInput(attrs={'class':'colorset-color'}),
            'color_four':forms.TextInput(attrs={'class':'colorset-color'}),
            'color_five':forms.TextInput(attrs={'class':'colorset-color'}),
        }

Not sure that all that code was needed for this problem but figured it couldn't hurt.

I'm a little lost (even though I've gotten this to work in the past) so any help would be most appreciated.

Upvotes: 0

Views: 92

Answers (1)

Mauricio Cortazar
Mauricio Cortazar

Reputation: 4213

If you use create view you don't have to write the form, automatically Django generate the modelform so should be something like:

class CreateWidgetView(LoginRequiredMixin,CreateView):
    login_url = '/login/'
    redirect_field_name = 'index.html'
    model = Widget
    fields = ['field', 'field2']

    def form_valid(self,form): #I Think this part is not neccesary
        self.object = form.save(commit=False)
        self.object.save()
        return super().form_valid(form) 

Upvotes: 1

Related Questions