2016-12-14 53 views
0

請注意,我是Django的新手。我創建了一個簡單的配置模型,我想用它在我的網站上設置一些全局設置。現在我創建了一個主題切換設置來替換主要的css文件,但我無法將它加載到我的登錄模板上。雖然在索引上工作得很好。請協助!Django視圖不返回模型到模板

瀏覽:

from django.shortcuts import render, HttpResponseRedirect 
from django.contrib.auth.decorators import login_required 
from django.contrib.auth import login, logout 
from .forms import LoginForm 
from .models import Configuration 


def get_theme(): 
    theme_name = Configuration.objects.only('theme_name').get().theme_name 
    context = {'theme_name': theme_name} 
    return context 


def login_view(request): 
    form = LoginForm(request.POST or None) 
    if request.POST and form.is_valid(): 
     user = form.login(request) 
     if user: 
      login(request, user) 
      return HttpResponseRedirect('index') # Redirect to a success page. 
    theme_name = get_theme() 
    context = theme_name.update({'login_form': form}) 
    return render(request, 'registration/login.html', context) 


def logout_user(request): 
    logout(request) 
    return HttpResponseRedirect('registration/login.html') 


@login_required(login_url='login/') 
def index(request): 
    theme_name = get_theme() 
    return render(request, 'base.html', theme_name) 

模板上的login.html:在base.html文件(工作)

{% compress css %} 
    <link href="{% static 'base/css/style-'%}{{ theme_name }}.css" rel="stylesheet" type="text/css"> 
{% endcompress %} 

模板:

{% compress css %} 
    <link href="{% static 'base/css/style-'%}{{ theme_name }}.css" rel="stylesheet" type="text/css"> 
    <link href="{% static 'base/css/sidebar-menu.css' %}" rel="stylesheet" type="text/css"> 
{% endcompress %} 

注意:我沒有在我的登錄頁面上加載Base.html,因爲用戶在base.html上看到任何內容之前需要先登錄。如果我這樣做的方式不對,請告訴我。

非常感謝您的幫助。

編輯爲forms.py:

class LoginForm(forms.Form): 
    username = forms.CharField(max_length=255, required=True) 
    password = forms.CharField(widget=forms.PasswordInput, required=True) 

    def clean(self): 
     username = self.cleaned_data.get('username') 
     password = self.cleaned_data.get('password') 
     user = authenticate(username=username, password=password) 
     if not user or not user.is_active: 
      raise forms.ValidationError("Sorry, that login was invalid. Please try again.") 
     return self.cleaned_data 

    def login(self, request): 
     username = self.cleaned_data.get('username') 
     password = self.cleaned_data.get('password') 
     user = authenticate(username=username, password=password) 
     return user 

回答

1

雖然你逝去的主題爲不正確的情況下,它看起來像你打算包含這個在每一個觀點,所以你會更好,將其添加爲背景處理器

def theme_name_processor(request): 

    theme_name = Configuration.objects.only('theme_name').get().theme_name 
    context = {'theme_name': theme_name} 
    return context 

然後在您的設置中添加對此的引用到上下文處理器列表。

請參閱Writing your own context processors

+1

@ justin-boucher這是一個非常好的主意。 – Brandon

+0

它看起來像個好主意。但這是我的第一個項目,我承認我不知道自己在做什麼。我不知道如何添加上下文處理器。 –

+0

@JustinBoucher - 這就是你所需要的......把這個方法放在某個地方,然後將它添加到你的設置中的上下文處理器列表中......例如''myapp.wherever.theme_name_processor'',那麼它可以在任何地方使用,而無需在任何視圖中添加它 – Sayse

1

theme_name中缺少你傳遞到模板中login_view上下文字典。您通過了:{'login_form': form}

您可以使用其他數據擴展由get_theme()提供的字典,反之亦然,也可以從兩者中創建一個新的字典,並將其傳遞給模板。

def login_view(request): 
    form = LoginForm(request.POST or None) 
    if request.POST and form.is_valid(): 
     user = form.login(request) 
     if user: 
      login(request, user) 
      return HttpResponseRedirect('index') # Redirect to a success page. 
    theme_name = get_theme() 
    context = theme_name.update({'login_form': form}) 
    return render(request, 'registration/login.html', context) 
+0

是......仍然丟失。我嘗試修改我的視圖來匹配上面的視圖,但顯然我仍然錯過了一些東西。我需要修改我的forms.py文件嗎? –

+0

不是我能看到的。我對分配一個新變量「context」的答案做了一些細微的調整,然後將其傳遞給模板。 – Brandon

+0

你確定你有'theme_name'的值嗎? – Brandon

1

您沒有正確傳遞主題。它需要與表單在同一個詞典中。

return render(request, 'registration/login.html', {'login_form': form, 'theme_name': theme_name}) 
+0

+1 - theme_name本身就是一本字典,但'get_theme'方法應該隨着這個改變,做它說得更準確的方法 – Sayse