[英]How to do a logical operation before saving to database in python Django
所以我是 Django 的新手,我想在我的應用程序中做一些硬件兼容性檢查功能,我制作一個表格來填寫並檢查數據庫的兼容性,然后顯示結果。 但問題是表單似乎只是繼續保存到數據庫而不首先處理邏輯操作。 這是我的看法
class CreateSimView(LoginRequiredMixin, CreateView):
login_url = '/login/'
model = Simulation
form_class = SimPostForm
template_name = 'sim_post.html'
redirect_field_name = 'sim/sim.html'
def simpost(request):
mtb = Motherboard.objects.all()
cpu = Cpu.objects.all()
vga = Vga.objects.all()
ram = Ram.objects.all()
storage = Storage.objects.all()
mtbform = request.GET.get('mtb_name')
cpuform = request.GET.get('cpu_name')
vgaform = request.GET.get('vga_name')
ramform = request.GET.get('ram_name')
strform = request.GET.get('str_name')
simcpu = cpu.objects.values_list('socket', flat=True).filter(name__icontains=cpuform)
simcpu1 = mtb.objects.values_list('socket', flat=True).filter(name__icontains=mtbform)
simvga = vga.objects.values_list('vga_interface', flat=True).filter(name__icontains=vgaform)
simvga1 = mtb.objects.values_list('vga_interface', flat=True).filter(name__icontains=mtbform)
simram = ram.objects.values_list('mem_type', flat=True).filter(name__icontains=ramform)
simram1 = mtb.objects.values_list('mem_type', flat=True).filter(name__icontains=mtbform)
simstr = str.objects.values_list('str_interface', flat=True).filter(name__icontains=strform)
simstr1 = mtb.objects.values_list('str_interface', flat=True).filter(name__icontains=mtbform)
if simcpu == simcpu1 :
if simvga == simvga1:
if simram == simram1:
if simstr == simstr1:
form = SimPostForm(request.POST)
if form.is_valid():
form.save()
return render(mtbform,cpuform,vgaform,ramform,strform,"/")
else:
strform = "not compatible"
return render(mtbform,cpuform,vgaform,ramform,strform,"/")
else:
ramform = "not compatible"
return render(mtbform,cpuform,vgaform,ramform,strform,"/")
else:
vgaform = "not compatible"
return render(mtbform,cpuform,vgaform,ramform,strform,"/")
else:
cpuform = "not compatible"
return render(mtbform,cpuform,vgaform,ramform,strform,"/")
我的表格模型
class Simulation(models.Model):
build_name = models.CharField(blank=False, max_length=150)
mtb_name = models.CharField(blank=False, max_length=150)
cpu_name = models.CharField(blank=False, max_length=150)
vga_name = models.CharField(blank=False, max_length=150)
ram_name = models.CharField(blank=False, max_length=150)
str_name = models.CharField(blank=False, max_length=150)
def __str__(self):
return self.build_name
def get_absolute_url(self):
return reverse('sim:sim_post')
和我的模板
{% extends "base.html" %}
{% load bootstrap4 %}
{% block content %}
<div class="container">
<div class="jumbotron">
<h1>Pilih Parts</h1>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
<div class="form-group">
<label for="build">Nama Rakitan</label>
<input class="form-control" type="text" id="build" name="build_name" value="{{ form.build_name.value|default_if_none:"" }}">
</div>
<div class="form-group">
<label for="mtb">Motherboard</label>
<input class="form-control" id="mtb" type="text" name="mtb_name" value="{{ form.mtb_name.value|default_if_none:"" }}">
</div>
<div class="form-group">
<label for="vga">Vga</label>
<input class="form-control" id="vga" type="text" name="vga_name" value="{{ form.vga_name.value|default_if_none:"" }}">
</div>
<div class="form-group">
<label for="ram">Ram</label>
<input class="form-control" type="text" id="ram" name="ram_name" value="{{ form.ram_name.value|default_if_none:"" }}">
</div>
<div class="form-group">
<label for="storage">Storage</label>
<input class="form-control" type="text" id="storage" name="str_name" value="{{ form.storage_name.value|default_if_none:"" }}">
</div>
<div class="form-group">
<label for="cpu">Cpu</label>
<input class="form-control" type="text" id="cpu" name="cpu_name" value="{{ form.cpu_name.value|default_if_none:"" }}">
</div>
<button type="submit" class="btn btn-secondary">Cek Kompatibilitas</button>
</form>
</div>
</div>
{% endblock %}
我還在我的表單中使用{{ form.storage_name.value|default_if_none:"" }}
希望它會返回之前的值。 但它似乎沒有這樣做。
在我看來,你實現了你的邏輯
def simpost(request)
但是您錯過了將這個 function 的調用集成到 CreateView 的預定義處理中。
所以一種方法可能是覆蓋
def post(self, request, *args, **kwargs)
CreateView 並將您的邏輯放在那里。 如果一切正常,你應該打電話
super().form_valid(your_form_object_here)
使用 CreateView 的預定義操作觸發數據的創建。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.