2017-09-01 33 views
0

因此,我已經獲得表單以正確顯示之前,我只是有點迷路,爲什麼我這樣做時使用某些單詞,我想知道爲什麼我用不同的詞來獲得不同的形式來展示。獲取表單以使用Django在HTML中顯示

在我使用{{ form }}這第一個例子(colorist_form.html),這也得到了形式顯示

{% 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 %} 

然而,在這個例子中(widget_form.html)我使用的是相同的{{ form }}但現在形式不顯示

{% 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 %} 

也是我register.html我使用{{ user_form }}這也得到了形式顯示。

{% 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 %} 

爲什麼我會使用關鍵字「form」而不是其他字詞,如「user_form」或「widget_form」?爲什麼widget_form.html不顯示錶單?

這裏是我的分別爲表單和視圖代碼:

adminpanel應用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應用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應用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應用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'}), 
     } 

不知道這是需要所有代碼這個問題,但想通這不能傷害。

我有點失落(即使我已經得到了這個工作在過去),所以任何幫助將不勝感激。

+0

沒有什麼特別之處的話「形式」,或「user_form」或「widget_form」,它們只是傳遞給模板的上下文中的鍵。例如,在繼承FormMixin的視圖中,[get_context_data'方法檢索表單並將其作爲「form」傳遞給模板](https://docs.djangoproject.com/en/1.11/ref/class-based-意見/混入編輯/#django.views.generic.edit.FormMixin.get_context_data)。 –

+0

@PauloAlmeida所以在我的情況下,爲什麼不在頁面上顯示錶單?它爲什麼只顯示一個按鈕到窗體? – Garrett

+0

'class Meta:'在表單類中不應該有parens。除此之外,我沒有看到任何錯誤。 –

回答

1

如果使用創建視圖你沒有寫的形式,自動的Django生成的ModelForm所以應該是這樣的:

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) 
+0

在html中,但我只是然後把'{{form}}'? – Garrett

+0

是的,像這個例子一樣https://docs.djangoproject.com/en/1.11/ref/class-based-views/generic-editing/#django.views.generic.edit。CreateView –

+0

是的,我讀到了,但是我爲什麼沒有談論「form」這個詞來自哪裏,但我失去了,但那是因爲FormView正在爲你設置它? – Garrett