簡體   English   中英

如何在不使用模型的情況下在Django模板中顯示python變量值?

[英]How to display python variable values in Django template without using Models?

我是Django的新手,目前正面臨這個問題。 我想計算一個圓的面積和周長,並將結果發布到Django模板中。 我使用了一種形式,允許用戶輸入將被視為半徑的任何數字。 使用POST方法,它將對其進行處理並向我輸出面積和周長(在views.py文件中)。 但是,我無法在Django模板HTML頁面中顯示面積和周長值。 我存儲在模型中的唯一值是用戶輸入的半徑值。 不使用模型如何顯示面積和周長?

表單半徑輸入的HTML頁面:insert_radius.html
用於顯示輸出的HTML頁面:view_result.html

請幫忙。

myapp / models.py:

from django.db import models

# Create your models here.
class Circle(models.Model):
    radius = models.IntegerField(default = 0)
    def __str__(self):
        return str(self.radius)

myapp / forms.py

from django import forms
from myapp.models import Circle

class CircleForm(forms.ModelForm):
    class Meta:
        model = Circle
        fields = ["radius"]

myapp / views.py

import math
from django.shortcuts import render
from django.views.generic import TemplateView, CreateView, ListView
from myapp.forms import CircleForm
from django.urls import reverse_lazy
from myapp.models import Circle
from django.http import HttpResponseRedirect

# Create your views here.

class HomeView(TemplateView):
    template_name = 'home.html'

class CircleView(CreateView):
    form_class = CircleForm
    template_name = 'insert_radius.html'

    def post(self, request, *args, **kwargs):
        form = self.form_class(request.POST)
        if form.is_valid():
            radius =  form.cleaned_data.get('radius')
            area = math.pi * (radius ** 2)
            perimeter = 2 * math.pi * radius
            print(radius, area, perimeter)
            form.save()
            final= {"radius" : radius, "area" : area, "perimeter": 
 perimeter}
            context= {'final': final}
            return HttpResponseRedirect(reverse_lazy("view_result"))
            return render(request, "view_result.html", context) 


        else:
            form = self.form_class()

class ViewResult(ListView):
    template_name = 'view_result.html'
    model = Circle

templates / insert_radius.html

<!DOCTYPE html>
<html>
<head>
    <title> Insert radius </title>
</head>
<body>

    <h1> Enter radius </h1>
    <form method="POST" enctype="multipart/form-data">
        {% csrf_token %}
        {{form}}
        <button type="submit"> Submit </button>
    </form>

</body>
</html>

templates / view_result.html

<!DOCTYPE html>
<html>
<head>
    <title> View result </title>
</head>
<body>

    Area: {{final.area}} <br>
    Perimeter: {{final.perimeter}} <br>

</body>
</html>

myapp / urls.py

from django.urls import path
from myapp.views import HomeView, CircleView, ViewResult

urlpatterns = [
   path('home', HomeView.as_view(), name = 'home'),
   path('insert_radius', CircleView.as_view(), name = 'insert_radius'),
   path('view_result', ViewResult.as_view(), name = 'view_result'),
]

首先,您的CircleView有太多樣板代碼。 實際上, CreateView的主要用例是讓Django處理創建視圖:

# app/views.py

from django.urls import reverse

class CircleView(CreateView):
    form_class = CircleForm
    template_name = 'insert_radius.html'

    def get_success_url(self):
        return reverse('view_result', kwargs={'pk': self.object.pk})

接下來,我們可以向圓添加一些功能以計算周長:

# app/models.py

from math import pi

class Circle(models.Model):
    radius = models.IntegerField(default=0)

    @property
    def perimeter(self):
        return 2*pi*self.radius

    def __str__(self):
        return str(self.radius)

這里的ViewResultDetailView ,因為它將顯示數據庫記錄的詳細信息。 我們還需要在該網址格式中添加一個主鍵參數:

# app/urls.py

from django.urls import path from myapp.views import HomeView, CircleView, ViewResult

urlpatterns = [ path('home', HomeView.as_view(), name = 'home'), path('insert_radius', CircleView.as_view(), name = 'insert_radius'), path('view_result/<int:pk>', ViewResult.as_view(), name = 'view_result'), ]

最后,在我們的視圖中,我們可以將ViewResult為detailview,並將circle變量重命名為final

# app/views.py

from django.views.generic.detail import DetailView
from app.models import Circle

class ViewResult(DetailView):
    template_name = 'view_result.html'
    model = Circle
    context_object_name = 'final'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM