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

Django - Unknown field(s). Formularze

Object Storage Arubacloud
0 głosów
299 wizyt
pytanie zadane 8 kwietnia 2019 w Python przez Eliro Stary wyjadacz (12,160 p.)
C:\Users\Admin\Desktop\MyShop>python manage.py runserver
Performing system checks...

Unhandled exception in thread started by <function check_errors.<locals>.wrapper
 at 0x0341E8E8>
Traceback (most recent call last):
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36-32\lib\site-packag
es\django\utils\autoreload.py", line 225, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36-32\lib\site-packag
es\django\core\management\commands\runserver.py", line 117, in inner_run
    self.check(display_num_errors=True)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36-32\lib\site-packag
es\django\core\management\base.py", line 379, in check
    include_deployment_checks=include_deployment_checks,
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36-32\lib\site-packag
es\django\core\management\base.py", line 366, in _run_checks
    return checks.run_checks(**kwargs)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36-32\lib\site-packag
es\django\core\checks\registry.py", line 71, in run_checks
    new_errors = check(app_configs=app_configs)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36-32\lib\site-packag
es\django\core\checks\urls.py", line 13, in check_url_config
    return check_resolver(resolver)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36-32\lib\site-packag
es\django\core\checks\urls.py", line 23, in check_resolver
    return check_method()
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36-32\lib\site-packag
es\django\urls\resolvers.py", line 396, in check
    for pattern in self.url_patterns:
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36-32\lib\site-packag
es\django\utils\functional.py", line 37, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36-32\lib\site-packag
es\django\urls\resolvers.py", line 533, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36-32\lib\site-packag
es\django\utils\functional.py", line 37, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36-32\lib\site-packag
es\django\urls\resolvers.py", line 526, in urlconf_module
    return import_module(self.urlconf_name)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36-32\lib\importlib\_
_init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:\Users\Admin\Desktop\MyShop\MyShop\urls.py", line 24, in <module>
    path('', include('shop.urls')),
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36-32\lib\site-packag
es\django\urls\conf.py", line 34, in include
    urlconf_module = import_module(urlconf_module)
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36-32\lib\importlib\_
_init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:\Users\Admin\Desktop\MyShop\shop\urls.py", line 3, in <module>
    from . import views
  File "C:\Users\Admin\Desktop\MyShop\shop\views.py", line 4, in <module>
    from .forms import *
  File "C:\Users\Admin\Desktop\MyShop\shop\forms.py", line 18, in <module>
    class BuyForm(forms.ModelForm):
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python36-32\lib\site-packag
es\django\forms\models.py", line 266, in __new__
    raise FieldError(message)
django.core.exceptions.FieldError: Unknown field(s) (delivery, buyer, item) spec
ified for Item

 

Usiłuję utworzyć funkcję "kup teraz" w swoim sklepie internetowym https://github.com/Incybro/MyShop i przyznaję, że trochę się pogubiłem. Chciałbym, aby po kliknięciu "kup teraz", użytkownika przekierowało do formularza, gdzie będzie miał wypełnione już jaki przedmiot chce zamówić oraz za jaką cenę, natomiast resztę formularza - dostawę - będzie wypełniać samodzielnie. Wymyśliłem, że zrobię to tak, jak kiedyś robiłem formularz edycji postu:

forms.py

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

class ItemForm(forms.ModelForm):
    img = models.ImageField(blank=True, null=True,
        upload_to='covers/%Y/%m/%D/')
    title = forms.CharField(max_length=100)
    price = models.FloatField(null=False, blank=False)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    class Meta:
        model = Item
        fields = (
        'title',
        'category',
        'price',
        'img',)
class BuyForm(forms.ModelForm):
    model = Order

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

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

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 *

def homepage(request):
	 items = Item.objects.filter(published_date__lte=timezone.now()).order_by('-published_date')
	 return render(request, 'shop/homepage.html', {'items': items})
def item_details(request, pk):
    item = get_object_or_404(Item, pk=pk)
    return render(request, 'shop/item_details.html', {'item': item})
def item_new(request):
	if request.method == "POST":
		form = ItemForm(request.POST, request.FILES)
		if form.is_valid():
			item = form.save(commit=False)
            item.buyer = request.user
            item.order_date = timezone.now()
			item.save()
			return redirect('item_details', pk=item.pk)
	else:
		form = ItemForm()
	return render(request, 'shop/item_edit.html', {'form': form})

def buy_item(request, pk):
	item = get_object_or_404(Item, pk=pk)
	if request.method == "POST":
		form = BuyForm(request.POST, instance=item)
		if form.is_valid():
			item = form.save(commit=False)
			item.author = request.user
			item.published_date = timezone.now()
			item.save()
			return redirect('item_details', pk=item.pk)
	else:
		form = BuyForm(instance=item)
	return render(request, 'shop/buy_item.html', {'item': item})

buy_item.html

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

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

urls.py

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

urlpatterns = [
	path('', views.homepage, name='homepage'),
	path('item/<int:pk>', views.item_details, name='item_details'),
	path('item/new', views.item_new, name='item_new'),
	path('buy/<int:pk>', views.buy_item, name='buy_item')
]

Niestety wyświetla mi się błąd jak powyżej, czyli Unknown field(s). Jak to poprawić? :/

2 odpowiedzi

+1 głos
odpowiedź 9 kwietnia 2019 przez adrian17 Ekspert (344,860 p.)
wybrane 11 kwietnia 2019 przez Eliro
 
Najlepsza
class BuyForm(forms.ModelForm):
    model = Order
 
    class Meta:
        model = Item

Coś tu aby w złym miejscu jest?

 

komentarz 11 kwietnia 2019 przez Eliro Stary wyjadacz (12,160 p.)
edycja 11 kwietnia 2019 przez Eliro

Jakoś nie wiele mi to pomaga, zważywszy na fakt, że wartości, które chce ustawić są kluczem obcym i wpisanie na sztywno jakiegoś tekstu nie przyniesie efektu.

Próbowałem też tak:

	def form_valid(self, form):
		form.instance.item = Item.objects.get(self.kwargs['pk'])
		return super(ItemCreate, self).form_valid(form)

Ale efekt ten sam, czyli nic się nie dzieje.

Nawet wpisanie "pk" na sztywno nic nie daje:

	def form_valid(self, form):
		form.instance.item = Item.objects.get(pk=1)
		return super(ItemCreate, self).form_valid(form)

Zero błędów, zero efektów.

komentarz 11 kwietnia 2019 przez adrian17 Ekspert (344,860 p.)

że wartości, które chce ustawić są kluczem obcym

No, ustawiasz wartość item_id - z punktu widzenia Order, przyszłego klucza obcego. W funkcyjnych widokach to by było dokładnie, jak w linku wyżej. W klasowych, na oko (piszę na sucho):

initial['item'] = self.kwargs['pk']

 

 

komentarz 11 kwietnia 2019 przez Eliro Stary wyjadacz (12,160 p.)

I że niby gdzie mam to wstawić? Bo gdziekolwiek nie wstawię, to wywala błąd, że albo nie wie co to "initial" albo nie wie co to "self".

Bo spójrz tutaj:

	def form_valid(self, form):
		form.instance.item = Item.objects.get(self.kwargs['pk'])
		return super(ItemCreate, self).form_valid(form)

Nic, kompletnie nic. Zero efektu.

komentarz 11 kwietnia 2019 przez adrian17 Ekspert (344,860 p.)

Wiesz co... może dla uproszczenia wrócę do funkcji.

class BuyForm(forms.ModelForm):
    class Meta:
        model = Order
        # ...

def buy_item(request, pk):
    item = get_object_or_404(Item, pk=pk)
    if request.method == "POST":
         # ...
    else:
        form = BuyForm(initial={'item': pk, 'price': item.price})

 

komentarz 11 kwietnia 2019 przez Eliro Stary wyjadacz (12,160 p.)
edycja 11 kwietnia 2019 przez Eliro
  File "C:\Users\Admin\Desktop\MyShop\shop\forms.py", line 27
    else:
       ^
IndentationError: expected an indented block

Natomiast przy takiej formie;

def buy_item(request, pk):
    item = get_object_or_404(Item, pk=pk)
    if request.method != "POST":
        form = BuyForm(initial={'item': pk, 'price': item.price})

Zero błędów, zero efektów.

 

Zrobiłem to tak:

	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()

Działa

–2 głosów
odpowiedź 9 kwietnia 2019 przez izonik Stary wyjadacz (12,560 p.)
Nie jestem pewny, ale spróbuj zmienić klasę bazową formularza z `forms.ModelForm` na `forms.Form`.
komentarz 9 kwietnia 2019 przez adrian17 Ekspert (344,860 p.)

Wtedy cały mechanizm z

    class Meta:
        model = Item

przestanie działać, nie?

Podobne pytania

0 głosów
0 odpowiedzi 125 wizyt
0 głosów
0 odpowiedzi 175 wizyt
pytanie zadane 14 marca 2017 w Python przez anderpy Nowicjusz (120 p.)
0 głosów
3 odpowiedzi 1,384 wizyt
pytanie zadane 6 listopada 2015 w Python przez Kaspero Obywatel (1,920 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...