Django 如何在CreateView中使字段只读
我是一个Django初学者,我正在尝试为订单创建一个只读的“价格”字段。我认为,根据我的理解,这不能在模型本身内部完成,而是在表单内部完成 因为我使用的是CreateView通用视图,所以我认为这可以通过将属性disabled设置为True来实现,如前所述 所以我所做的是,在views.py中Django 如何在CreateView中使字段只读,django,Django,我是一个Django初学者,我正在尝试为订单创建一个只读的“价格”字段。我认为,根据我的理解,这不能在模型本身内部完成,而是在表单内部完成 因为我使用的是CreateView通用视图,所以我认为这可以通过将属性disabled设置为True来实现,如前所述 所以我所做的是,在views.py中 from django.shortcuts import render from django.views.generic import CreateView from .models import Or
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',
]
但这不起作用。
这是我的模特
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, on_delete=models.CASCADE, default=None)
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, on_delete=models.CASCADE, default=None)
有人能给我一个提示吗?
请考虑我仍然在学习,所以我更喜欢编码的答案和描述性的答案。
提前感谢您我对Django的CreateView没有任何经验,但据我所知,它的工作原理类似于一个单独的表单。您可以尝试以下方法:
类CreateOrderView(CreateView):
型号=订单
模板名称='home.html'
字段=[
“餐名”,
“餐费”,
“餐厅”,
“客户”,
]
定义初始化(self,*args,**kwargs):
super(CreateOrderView,self)。\uuuuuuu初始化(*args,**kwargs)
self.fields['mean_price'].widget.attrs['disabled']=True
根据我的经验,出于安全考虑,禁用属性将很好地防止用户编辑HTML和更改值。但是,当传递到clean方法时,您将无法访问此值。如果需要对该值执行操作,则应将“disabled”更改为“readonly”,但您将无法获得与disabled提供的相同的数据保护。好的,多亏了DirkRoten,我已经找到了答案。 基本上,我需要的是: 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, on_delete=models.CASCADE, default=None)
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, on_delete=models.CASCADE, default=None)
forms.py中的一个OrderForm(ModelForm),用于修改price字段,将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'
你不能在视图中这样做,你需要在表单中这样做。您在视图中创建一个
fine\u price
表单字段的语句没有任何作用,因为视图没有字段。因此,您应该创建一个自定义的OrderForm
(aModelForm
)并设置form\u class=OrderForm
(并从CreateView
中删除字段和model
,因为它不在表单中)。但我的主要问题是:如果禁用它,您将在该字段中显示什么?因为这是一个CreateView
,所以还没有Order
对象,所以所有字段都是空的,包括餐费
。那么,为什么要首先显示一个禁用的空字段呢?要从何处获取其值?CreateView
没有表单字段<代码>字段
是要包含在表单中的字段的字符串列表。因此,self.fields['mean\u price']
将引发一个错误,该列表仅将整数作为下标,而不是字符串。因为self.fields
是上面定义的列表,而不是字典。所以基本上CreateView太简单了,为了利用其他功能,表单应该分开。是的,CreateView
还采用了form\u class
属性,允许您指定要使用的表单。在这种情况下,您需要删除模型
和字段
属性(将它们放在表单的元
中)。