Django无法分配“[<store:toby =”“pet =”“store =”“>]”:</store:>

时间:2013-03-03 15:05:07

标签: django

我正在开一家宠物店应用程序。

该应用程序显示所有宠物商店,当您点击宠物商店时,您会看到他们的宠物。

enter image description here

我创建了一个表单,允许用户毫无问题地添加商店。:D

现在问题出在这里。当我为宠物主人创建一个表格,将他们的宠物添加到他们的商店。 我收到了这个错误。

我试图让用户创建他们的宠物并将其添加到他们的商店而不是使用管理页面。

Cannot assign "[<Store: John Pet Store>]": "Pet.owner" must be a "Store" instance.
Traceback Switch to copy-and-paste view
C:\djcode\mysite\pet\views.py in fan
if form.is_valid():

我的models.py

from django.db import models

class Store(models.Model):
    name = models.CharField(max_length = 20)
    number = models.BigIntegerField()
    address =models.CharField(max_length = 20)
    def __unicode__(self):
    return self.name

class Pet(models.Model):
    animal = models.CharField(max_length =20)
    description = models.TextField()
    owner = models.ForeignKey(Store)
    image = models.FileField(upload_to="images/")

    def __unicode__(self):
        return self.animal

我的forms.py

from django import forms
from pet.models import Store
from pet.models import Pet
class StoreForm(forms.ModelForm):
    name = forms.CharField(max_length =20,widget =forms.Textarea)
    number = forms.CharField(max_length =20,widget =forms.Textarea)
    address = forms.CharField(max_length = 20,widget = forms.Textarea)

    class Meta: 
        model = Store
        fields = ('name','number','address')

class PetForm(forms.ModelForm):
    animal =forms.CharField(max_length = 20,widget = forms.Textarea)
    description =forms.CharField(max_length =20, widget = forms.Textarea)
    owner = forms.ModelMultipleChoiceField(queryset=Store.objects.all())
    image = forms.FileField()

    class Meta:
        model = Pet
        fields = ('animal','description','owner','image')

我的views.py

 from pet.models import Store , Pet
 from django.shortcuts import render_to_response ,get_object_or_404
 from pet.forms import StoreForm
 from django.template import RequestContext
 from django.core.urlresolvers import reverse
 from django.http import HttpResponseRedirect
 from pet.forms import PetForm

 def index(request):
    store = Store.objects.all()
    return render_to_response ('store.html',{'store':store})

 def brazil(request , animal_id):
     pets = Pet.objects.filter(owner_id=animal_id)
     return render_to_response ('animal.html',{'pets':pets})

 def create(request):
     form = StoreForm(request.POST or None)
     if form.is_valid():
         store = form.save(commit=False)
         store.save()
         if 'dog' in request.POST:
             dog = request.POST['next']
         else:
             dog = reverse('world:index')
         return HttpResponseRedirect(dog)
     return render_to_response(
         'creates.html',
         {'form':form},
         context_instance = RequestContext(request)
 )

 def fan(request):
     form = PetForm(request.POST or None)
     if form.is_valid():
         dad = form.save(commit=False)
         dad.save()
         if 'cat' in request.POST:
             cat = request.POST['next']
         else:
             cat = reverse('world:index')
         return HttpResponseRedirect(cat)
     return render_to_response(
         'fan.html',
         {'form':form},
         context_instance = RequestContext(request)
 )     

我的粉丝

 <form method="POST" "action">{% csrf_token %}
    <ul>
        {{ form.as_ul }}
    </ul>
    <input type = "submit" value= "Add Pets to Store" />
 </form>

2 个答案:

答案 0 :(得分:2)

class StoreForm(forms.ModelForm):
    class Meta: 
        model = Store

class PetForm(forms.ModelForm):
    class Meta:
        model = Pet

    def __init__(self, *args, **kwargs):
        super(PetForm, self).__init__(*args, **kwargs)
        self.fields['owner'].queryset = Store.objects.all()


def create(request):
     if request.method == 'POST':
         form = StoreForm(request.POST)
         if form.is_valid():
             form.save()

             if 'dog' in request.POST:
                 dog = request.POST['next']
             else:
                 dog = reverse('world:index')

             return HttpResponseRedirect(dog)
     return render_to_response(
         'creates.html',
         {'form':StoreForm()},
         context_instance = RequestContext(request)
 )

 def fan(request):
     form = PetForm()
     if request.method == 'POST':
         form = PetForm(request.POST)
         if form.is_valid():
             form.save()

             if 'cat' in request.POST:
                 cat = request.POST['next']
             else:
                 cat = reverse('world:index')

             return HttpResponseRedirect(cat)
     return render_to_response(
         'fan.html',
         {'form':form},
         context_instance = RequestContext(request)
 )     

答案 1 :(得分:1)

问题就在这里:

Cannot assign "[<Store: John Pet Store>]": "Pet.owner" must be a "Store" instance.

[<Store: John Pet Store>]不是Store,它是一个包含Store个对象的数组(在您的情况下只有一个)。

在您的宠物表格中,您拥有此行:

owner = forms.ModelMultipleChoiceField(queryset=Store.objects.all())

但是你不希望所有者成为多选字段,否则一系列所有者将会回来(现在正在进行中)。

你应该把它改成:

owner = forms.ModelChoiceField(queryset=Store.objects.all())

来自评论

的编辑
class PetForm(forms.ModelForm):
    class Meta:
        model = Pet
        fields = ('animal','description','owner','image')`