2015-08-11 3 views
-1

Теперь я хочу создать форму, в которой я мог бы редактировать обе модели (я хочу показать корзину с продуктами и иметь возможность редактировать цену каждого продукта из этой тележки). Я использовал inlineformset_factory, но он отображает ошибку. Я использую этот путь впервые, поэтому я понятия не имею, что я должен изменить.Форма Django с двумя моделями

'shop.Product' has no ForeignKey to 'shop.Cart'.

models.py

class Product(models.Model): 
    name = models.CharField(max_length=100) 
    price = models.IntegerField(default='0') 

    def __unicode__(self): 
     return u"{}({})".format(self.name, self.price) 

class Cart(models.Model): 
    product = models.ManyToManyField(Product) 
    name = models.CharField(max_length=50) 

    def __unicode__(self): 
     return self.name 

forms.py

class CartForm(forms.ModelForm): 
    product = forms.ModelMultipleChoiceField(queryset = Product.objects.all(), widget=forms.CheckboxSelectMultiple(),required=True) 
    name = forms.CharField(max_length=45, label='nazwa') 
    price = forms.IntegerField(label='price') 

    class Meta: 
     model = Cart 
     fields = ('product', 'name', 'price') 

IngredientFormSet = inlineformset_factory(Cart, Product) 

views.py

def cart_new(request): 
    if request.method == "POST": 
     form = CartForm(request.POST) 
     if form.is_valid(): 
      cart = form.save(commit=False) 
      cart.save() 
      form.save_m2m() 
      ingredient_formset = IngredientFormSet(request.POST) 
      if ingredient_formset.is_valid(): 
       ingredient = formset.save(commit=False) 
       ingredient_formset.save() 
       return redirect('shop.views.cart_detail', pk=cart.pk) 
    else: 
     form = CartForm() 
    return render(request, 'shop/cart_edit.html', {'form': form}) 

ошибка:

Traceback: 
File "C:\Users\znawca\myapp\venv\lib\site-packages\django\core\handlers\base.py" in get_response 
    119.     resolver_product = resolver.resolve(request.path_info) 
File "C:\Users\znawca\myapp\venv\lib\site-packages\django\core\urlresolvers.py" in resolve 
    366.    for pattern in self.url_patterns: 
File "C:\Users\znawca\myapp\venv\lib\site-packages\django\core\urlresolvers.py" in url_patterns 
    402.   patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module) 
File "C:\Users\znawca\myapp\venv\lib\site-packages\django\core\urlresolvers.py" in urlconf_module 
    396.    self._urlconf_module = import_module(self.urlconf_name) 
File "D:\Python27\Lib\importlib\__init__.py" in import_module 
    37.  __import__(name) 
File "C:\Users\znawca\myapp\league\league\urls.py" in <module> 
    6.  url(r'', include('shop.urls')), 
File "C:\Users\znawca\myapp\venv\lib\site-packages\django\conf\urls\__init__.py" in include 
    33.   urlconf_module = import_module(urlconf_module) 
File "D:\Python27\Lib\importlib\__init__.py" in import_module 
    37.  __import__(name) 
File "C:\Users\znawca\myapp\league\shop\urls.py" in <module> 
    2. from . import views 
File "C:\Users\znawca\myapp\league\shop\views.py" in <module> 
    2. from .forms import * 
File "C:\Users\znawca\myapp\league\shop\forms.py" in <module> 
    19. IngredientFormSet = inlineformset_factory(Cart, Product) 
File "C:\Users\znawca\myapp\venv\lib\site-packages\django\forms\models.py" in inlineformset_factory 
    1020.  fk = _get_foreign_key(parent_model, model, fk_name=fk_name) 
File "C:\Users\znawca\myapp\venv\lib\site-packages\django\forms\models.py" in _get_foreign_key 
    992.      parent_model._meta.object_name, 

Exception Type: ValueError at/
Exception Value: 'shop.Product' has no ForeignKey to 'shop.Cart'. 
+0

Пожалуйста, отправьте свой метод просмотра и полную трассировку стека ошибок. –

+0

Привет @Shang Wang Я отредактировал первое сообщение. Я не знаю, что это все, что вам нужно. – znawca

ответ

0

Как вы можете найти в documentation, встроенные формы могут использоваться только для внешних ключей, а не для полей M2M. Вам придется самостоятельно создавать свой собственный набор форм.

Вы бы об этом так:

# In your view: 
IngredientFormSet = modelformset_factory(Product) 
ingredient_formset = IngredientFormSet(
    request.POST, request.FILES, 
    queryset=cart.product.all() 
) 

Вы также хотите изменить фактическую экономию присоединять ингредиентов в их корзину.

# cart has already been saved 
ingredients = ingredient_formset.save() 
cart.product = ingredients 
+0

Спасибо, этот вид выглядит хорошо, но что я должен изменить в forms.py, чтобы сделать его правильным? – znawca

Смежные вопросы