Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从Django模型筛选ForeignKey id_Python_Django_Django Models_Django Forms - Fatal编程技术网

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