Python 从Django模型筛选ForeignKey id
我想从属于特定Python 从Django模型筛选ForeignKey id,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我想从属于特定id的Foriegnkey中的某些字段中获取数据。但我可以;I don’我不知道如何使它工作。我有两个模型 class Tick(models.Model): user=models.ForeignKey(User) event_name=models.CharField(max_length=100) ticket_quantity=models.PositiveIntegerField(max_length=50, null=True, blank=True
id
的Foriegnkey
中的某些字段中获取数据。但我可以;I don’我不知道如何使它工作。我有两个模型
class Tick(models.Model):
user=models.ForeignKey(User)
event_name=models.CharField(max_length=100)
ticket_quantity=models.PositiveIntegerField(max_length=50, null=True, blank=True,help_text='Optional, if you have unlimited ticket')
ticket_plan_name_a=models.CharField(max_length=100, null=True, blank=True)
ticket_plan_price_a=models.PositiveIntegerField(max_length=50, null=True, blank=True, verbose_name="Price",help_text='ticket price.')
ticket_plan_name_b=models.CharField(max_length=100, null=True, blank=True)
ticket_plan_price_b=models.PositiveIntegerField(max_length=50, null=True, blank=True, verbose_name="Price1",help_text='ticket price.')
另一种模式
class BuyTick(models.Model):
user=models.ForeignKey(User)
tik=models.ForeignKey(Tick)
tiket_qty=models.PositiveIntegerField(max_length=100)
pub_date=models.DateTimeField()
full_name=models.CharField(max_length=100)
def __unicode__(self):
return self.tiket
class BuyTickForm(forms.ModelForm):
tik=forms.ModelChoiceField(queryset=Tick.objects.get(pk=tick_id))
class Meta:
model=BuyTick
在尝试了以上代码之后,我得到了
名称错误:未定义名称“勾号id”
如何从models tick中获取特定的tick_id,以便在BuyTick表单中显示某些字段
更新:查看
def purchase_ticket(request, tikid):
if request.method=="POST":
form=BuyTickForm(request.POST)
if form.is_valid():
data=form.cleaned_data
newbuy=BuyTick(
user=request.user,
tik=Ticket.objects.get(pk=tikid),
tiket_qty=data['tiket_qty'],
full_name=data['full_name'],
phone_no=data['phone_no'],
pub_date=datetime.datetime.now())
newbuy.save()
return HttpResponse('Your ticket have been booked')
else:
print form.errors
else:
return render_to_response('buytickform.html',{'BuyTickForm':BuyTickForm,'post':Tick.objects.all().get(id=tikid)},context_instance=RequestContext(request))
模板
<p> Event Name: {{post.event_name}} </p>
<form action="." method="POST">
{% csrf_token %}
{{BuyTickForm.as_p}}
<input type="submit" class="radbutton radorange" value="Confirm Ticket"/>
</form>
事件名称:{{post.Event_Name}
{%csrf_令牌%}
{{BuyTickForm.as_p}}
首先,您的模型可以使用一些调整:
class BuyTick(models.Model):
. . .
tiket_qty=models.PositiveIntegerField(default=0, max_length=100)
pub_date=models.DateTimeField(auto_now_add=True)
. . .
def __unicode__(self):
# not sure what you're returning here...
return self.tiket
实例化表单时,您需要传入要筛选的id,还可以传入请求中的用户,您可以自动设置:
class BuyTickForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.tikid = kwargs.pop('tikid')
self.user = kwargs.pop('user')
super(BuyTickForm, self).__init__(*args, **kwargs)
tik=forms.ModelChoiceField(queryset=Tick.objects.filter(id=self.tikid))
class Meta:
model=BuyTick
def save(self, commit=True):
buy_tick = super(BuyTickForm, self).save(commit=False)
buy_tick.user = self.user
if commit:
buy_tick.save()
return buy_tick
您需要filter()
勾选对象,而不是使用get
,否则您将返回多个对象,这将在使用.get()
时引发异常
这个观点可能需要一些爱:
def purchase_ticket(request, tikid):
tick = get_object_or_404(Tick, id=tikid)
form = BuyTickForm(request.POST or None, tikid=tikid, user=request.user)
if request.method == 'POST' and form.is_valid():
form.save()
# note that these fields don't exist on your model:
# full_name, phone_no
# return something here... a redirect probably
else:
return render(request, 'buytickform.html',
{'tick': tick, 'form': form})
谢谢你的回复。但是我得到了Namerror:name'self'没有定义。请确保在init
I之前和之后使用了双下划线。我写了init,但仍然收到nameerror。您确定在该类中收到了name错误吗?这绝对是正确的语法。下面是一个示例类:您可以将其粘贴到编辑器中,并查看输出,它与您的ModelForm
基本相同,谢谢我修复了它。现在在模板中,我得到了KeyError:tick_id