【问题标题】:Django view not returning model to templateDjango视图没有将模型返回到模板
【发布时间】:2017-04-30 04:24:26
【问题描述】:

请注意,我是 Django 新手。我创建了一个简单的配置模型,我想用它在我的站点上设置一些全局设置。现在我只创建了一个替换主 css 文件的主题切换设置,但我无法将它加载到我的登录模板上。虽然在索引上工作正常。请帮忙!

观看次数:

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 上的模板:

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

Base.html 上的模板(工作):

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

【问题讨论】:

    标签: django django-templates django-views


    【解决方案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

    【讨论】:

    • 这看起来是个好主意。但这是我的第一个项目,我承认我不知道自己在做什么。我还不知道如何添加上下文处理器。
    • @JustinBoucher - 这就是你所需要的......把这个方法放在某个地方然后将它添加到你的设置中的上下文处理器列表......即'myapp.wherever.theme_name_processor',然后它可以在任何地方使用必须在任何视图中添加它
    【解决方案2】:

    您没有正确传递主题。它需要与表单在同一个字典中。

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

    【讨论】:

    • +1 - theme_name 本身就是一个字典,get_theme 方法可能应该被更改为更准确地执行它所说的操作
    【解决方案3】:

    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)
    

    【讨论】:

    • 是的……还是迷路了。我尝试修改我的视图以匹配上面的视图,但显然我仍然缺少一些东西。我需要修改我的 forms.py 文件吗?
    • 我看不到。我对答案进行了微调以分配一个新变量context,然后将其传递给模板。
    • 你确定你有 theme_name 的值吗?
    • 是的...它正确传递到我的索引,而不是 login.html。我将用我的 forms.py 更新原始问题
    • 我不确定为什么它不起作用。我可以告诉你的是render函数的签名是:请求(对象)、模板(字符串)、上下文(字典)
    猜你喜欢
    • 2011-07-28
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2023-03-19
    • 2021-03-10
    • 2013-02-23
    相关资源
    最近更新 更多