• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Python Django - jak zablokować przed zapisem pola w formularzu

Konkurs Mistrz Programowania
0 głosów
416 wizyt
pytanie zadane 11 kwietnia 2019 w Python przez Eliro Stary wyjadacz (12,160 p.)
edycja 11 kwietnia 2019 przez Eliro

forms.py

from django import forms
from .models import *
from django.db import models

class ItemForm(forms.ModelForm):

    class Meta:
        model = Item
        fields = (
        'title',
        'category',
        'price',
        'img',)
class BuyForm(forms.ModelForm):

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

views.py

from django.shortcuts import render, get_object_or_404, redirect
from .models import Item, Category
from django.utils import timezone
from .forms import *
from django.views.generic.edit import CreateView, DeleteView, UpdateView


# Reszta kodu

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

urls.py

from django.contrib import admin
from django.urls import path
from . import views
from .views import ItemCreate

urlpatterns = [
#Reszta kodu
	path('buy/<int:pk>', ItemCreate.as_view(), name='buy_item')
]

Potrzebuję zablokować przed zapisem pola tekstowe w formularzu "BuyForm". Chodzi o pola "item", "price" oraz "buyer". Mają one być tylko do odczytu.

Od razu zaznaczam, że próbowałem tego sposobu:

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',)

Który okazał się nieskuteczny, ponieważ błędu co prawda konsola nie pokazuje, lecz pola nadal można dowolnie edytować.

1 odpowiedź

+1 głos
odpowiedź 23 kwietnia 2019 przez andrew80 Użytkownik (900 p.)
wybrane 24 kwietnia 2019 przez Eliro
 
Najlepsza
self.fields['buyer'].widget.attrs['disabled'] = True

https://docs.djangoproject.com/en/2.2/ref/forms/fields/#disabled

 

Podobne pytania

0 głosów
1 odpowiedź 395 wizyt
pytanie zadane 28 marca 2017 w Python przez dzidziamocarz Początkujący (370 p.)
0 głosów
0 odpowiedzi 149 wizyt
pytanie zadane 2 kwietnia 2023 w Python przez Mateusz_MM Początkujący (430 p.)
0 głosów
1 odpowiedź 663 wizyt

93,652 zapytań

142,573 odpowiedzi

323,088 komentarzy

63,165 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...