gpt4 book ai didi

python - 如何在 Django 表单中创建用户无法编辑的只读字段?

转载 作者:行者123 更新时间:2023-12-01 08:00:45 24 4
gpt4 key购买 nike

我正在尝试在 python django 中创建我自己的第一个项目。到目前为止我所做的是一个简单的商店。当我点击这个时:

item_details.html

<a href="{% url 'buy_item' pk=item.pk %}" class="submit">Kup teraz</a>

我将被重定向

urls.py

path('buy/<int:pk>', ItemCreate.as_view(), name='buy_item')

此表格:

form.py

class BuyForm(forms.ModelForm):

class Meta:
model = Order
fields = (
'item',
'delivery',
'price',
'buyer',)

有了这个 View :

views.py

class ItemCreate(CreateView):
model = Order
fields = ['item', 'price', 'buyer', 'delivery']

def get_initial(self):
item = get_object_or_404(Item, pk=self.kwargs['pk'])
self.initial.update({
'buyer': self.request.user,
'price': item.price,
'item': item.pk,
})
return super(ItemCreate, self).get_initial()

models.py

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User

class Category(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()

def __str__(self):
return self.title
class Item(models.Model):
seller = models.ForeignKey(User, on_delete=models.CASCADE)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
price = models.FloatField(null=False, blank=False)
img = models.ImageField(blank=True, null=True,
upload_to='covers/%Y/%m/%D/')
published_date = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.title

class Supplier(models.Model):
title = models.CharField(max_length=100)
def __str__(self):
return self.title

class Delivery(models.Model):
title = models.ForeignKey(Supplier, on_delete=models.CASCADE)
price_of_delivery = models.FloatField(null=False, blank=False)
def __str__(self):
return self.title

class Order(models.Model):
item = models.ForeignKey(Item, on_delete=models.CASCADE)
delivery = models.ForeignKey(Delivery, on_delete=models.CASCADE)
order_date = models.DateTimeField(default=timezone.now)
buyer = models.ForeignKey(User, on_delete=models.CASCADE)
price = models.FloatField(null=False, blank=False)
def __str__(self):
return self.item

因为初始数据不应由用户编辑,所以我想将它们设为只读。

到目前为止我尝试过的是:

class BuyForm(forms.ModelForm):

def __init__(self, *args, **kwargs):
super(BuyForm, self).__init__(*args, **kwargs)
self.fields['buyer'].widget.attrs['readonly'] = True

class Meta:
model = Order
fields = (
'item',
'delivery',
'price',
'buyer',)

我的控制台中没有错误,但也没有结果。

我的 order_form.html 看起来是这样的:

{% extends 'shop/base.html' %}
{% block content %}

<div align="center">
<h1>Buy item</h1>
<form method="POST" class="post-form">{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="save btn btn-default">Buy</button>
</form>
</div>
<
{% endblock %}

如何将“买家”、“价格”和“商品”设置为只读?

最佳答案

所有其他答案都很棒且正确,但是当我创建您的示例时,这并没有解决问题。

实际问题是您的 View 从一开始就不会使用您的表单 - 这就是为什么覆盖属性没有执行任何操作!

有关带有自定义表单的基于类的 View 的更多信息,来自 django docs

View .py

from django.shortcuts import get_object_or_404
from django.views.generic import CreateView
from .models import Item
from .forms import BuyForm

class ItemCreate(CreateView):
form_class = BuyForm
template_name = 'order_form.html'
success_url = '/thanks/'

def get_initial(self):
item = get_object_or_404(Item, pk=self.kwargs['pk'])
self.initial.update({
'buyer': self.request.user.id,
'price': item.price,
'item': item.pk,
})
return super(ItemCreate, self).get_initial()

表单.py

from django import forms
from .models import Order


class BuyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(BuyForm, self).__init__(*args, **kwargs)
self.fields['buyer'].disabled = True

class Meta:
model = Order
fields = (
'item',
'delivery',
'price',
'buyer',)

关于python - 如何在 Django 表单中创建用户无法编辑的只读字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55746835/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com