Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何在CreateView中使字段只读_Django - Fatal编程技术网

Django 如何在CreateView中使字段只读

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

我是一个Django初学者,我正在尝试为订单创建一个只读的“价格”字段。我认为,根据我的理解,这不能在模型本身内部完成,而是在表单内部完成

因为我使用的是CreateView通用视图,所以我认为这可以通过将属性disabled设置为True来实现,如前所述

所以我所做的是,在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',
    ]
但这不起作用。 这是我的模特

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
(a
ModelForm
)并设置
form\u class=OrderForm
(并从
CreateView
中删除
字段和
model
,因为它不在表单中)。但我的主要问题是:如果禁用它,您将在该字段中显示什么?因为这是一个
CreateView
,所以还没有
Order
对象,所以所有字段都是空的,包括
餐费
。那么,为什么要首先显示一个禁用的空字段呢?要从何处获取其值?
CreateView
没有表单字段<代码>字段
是要包含在表单中的字段的字符串列表。因此,
self.fields['mean\u price']
将引发一个错误,该列表仅将整数作为下标,而不是字符串。因为
self.fields
是上面定义的列表,而不是字典。所以基本上CreateView太简单了,为了利用其他功能,表单应该分开。是的,
CreateView
还采用了
form\u class
属性,允许您指定要使用的表单。在这种情况下,您需要删除
模型
字段
属性(将它们放在表单的
中)。