[英]Django: How do I display this variable information in models to my template
[英]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)
這里的ViewResult
是DetailView
,因為它將顯示數據庫記錄的詳細信息。 我們還需要在該網址格式中添加一個主鍵參數:
# 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.