作者:诺 | 来源:互联网 | 2023-09-17 18:35
我是Django的初学者,我正在尝试将订单的“价格”字段设为只读。根据我的理解,我认为这不能在模型本身内部完成,而可以在表单内部完成。
由于我使用的是CreateView通用视图,因此我认为可以通过将属性disable设置为True来完成,如here所述。
所以我要做的是在views.py
from django.shortcuts import render
from django.views.generic import CreateView
from .models import Order
from django import forms
# Create your views here.
class CreateOrderView(CreateView):
model = Order
template_name = 'home.html'
meal_price = forms.DecimalField(disabled=True)
fields = [
'meal_name','meal_price','restaurant','customer',]
但这不起作用。
这是我的模型。py
from django.db import models
from restaurant.models import Restaurant
from account.models import Customer
# Create your models here.
class Order(models.Model):
meal_name = models.CharField(max_length=255)
meal_price = models.DecimalField(max_digits=5,decimal_places=2)
restaurant = models.ForeignKey(Restaurant,on_delete=models.CASCADE,default=None)
customer = models.ForeignKey(Customer,default=None)
有人可以给我一个提示吗?
请考虑我仍在学习,所以我更喜欢编码答案而不是描述性答案。
预先谢谢你
好的,感谢dirkgroten,我已经找到了答案。
基本上,在我的情况下,需要的是:
models.py中的订购模型
from django.db import models
from restaurant.models import Restaurant
from account.models import Customer
# Create your models here.
class Order(models.Model):
meal_name = models.CharField(max_length=255)
meal_price = models.DecimalField(max_digits=5,decimal_places=2)
restaurant = models.ForeignKey(Restaurant,on_delete=models.CASCADE,default=None)
customer = models.ForeignKey(Customer,default=None)
forms.py中的OrderForm(ModelForm),用于修改价格字段,将Disabled属性设置为true
from django.forms import ModelForm
from .models import Order
from django import forms
class OrderForm(ModelForm):
meal_price = forms.DecimalField(max_digits=5,decimal_places=2,disabled=True)
class Meta:
model = Order
fields = [
'meal_name','meal_price','restaurant','customer',]
views.py中的OrderView(CreateView)
from django.shortcuts import render
from django.views.generic import CreateView
from .forms import OrderForm
# Create your views here.
class OrderView(CreateView):
form_class = OrderForm
template_name = 'home.html'
,
我没有使用Django的CreateView的经验,但是从我的阅读来看,它的工作原理类似于单独的表单。您可以尝试这样的事情:
class CreateOrderView(CreateView):
model = Order
template_name = 'home.html'
fields = [
'meal_name',]
def __init__(self,*args,**kwargs):
super(CreateOrderView,self).__init__(*args,**kwargs)
self.fields['meal_price'].widget.attrs['disabled'] = True
从我的经验来看,出于安全方面的考虑,禁用的属性对于防止用户编辑HTML和更改值的作用是很好的。但是,当您将其传递给clean方法时,将无法访问该值。如果您需要对该值执行操作,则应将“已禁用”更改为“只读”,但不会具有与已禁用商品相同的数据保护。