如何从特定表生成窗体并将其保存到其他选项卡

2024-04-24 22:16:32 发布

您现在位置:Python中文网/ 问答频道 /正文

据我所知,每当我们制作表单时,它都会从表中提取表单并保存到同一个表中。 例如:

class ExampleForm(forms.Form):
     class Meta:
          model=Example

这里ExampleForm是由Example模型形成的,一旦提交,它就被保存回Example模型。 我想要的是,我想从一个表中开发一个窗体并将它保存到另一个表中? 这可能吗?

我为什么要这个?

因为,我正在创建一个表单,它只包含复选框,并且从表中检索这些复选框的标签,但是我想将用户输入保存到另一个表中

型号.py

class Offer(models.Model):

    package = models.ForeignKey(Package)
    discount = models.CharField(max_length=120,null=True,blank=True)
    transportation = models.CharField(max_length=120,null=True,blank=True)
    nextTrip = models.CharField(max_length=120,null=True,blank=True)
    rewardPoints = models.IntegerField(max_length=3,null=True,blank=True)
    refferals = models.CharField(max_length=3, choices=REFERRAL_CHOICES)

    def __str__(self):
        return self.package.packageTitle

Offer模型用于创建表单,但是一旦提交了数据,就应该将其保存在OfferRequest模型中

class OfferRequest(models.Model):   
    offerReq = models.ForeignKey(Offer,null=True)
    userReq = models.ForeignKey(User)
    discountReq = models.BooleanField(default=False)
    transportationReq = models.BooleanField(default=False)
    nextTripReq = models.BooleanField(default=False)
    rewardPointsReq = models.BooleanField(default=False)
    refferalsReq = models.BooleanField(default=False)

    def __str__(self):
        return self.discountReq

表单.py

class OfferRequestForm(forms.ModelForm):
    discountReq = forms.BooleanField(required=False,label="Discount")
    transportationReq = forms.BooleanField(required=False,label="Transportation")
    nextTripReq = forms.BooleanField(required=False,label="Next Trip")
    rewardPointsReq = forms.BooleanField(required=False,label="Reward Points")
    refferalsReq = forms.BooleanField(required=False,label="Refferals")
    class Meta:
        model = OfferRequest
        fields = ("discountReq","transportationReq","nextTripReq","rewardPointsReq","refferalsReq")

由于我是从OfferRequest生成表单,因此呈现如下所示:

() discount
() transportation
() nextTrip
() refferals
() rewardPoints

但我想要的是:

() discount : 3%
() transportation :FREE
() nextTrip :20%
() refferals : Yes
() rewardPoints : 200

如果表单是从Offer模型派生的,则可以呈现上述表单输出,因为不同的提供是在Offer模型中定义的

现在当这个表单(从Offer派生)提交时,我希望它保存在OfferRequest


尽我最大的努力解释,如果有什么不清楚的,一定要问


Tags: 模型falsetruedefault表单modelsrequiredforms
1条回答
网友
1楼 · 发布于 2024-04-24 22:16:32

如果要将Offer的值添加到OfferRequestForm的字段标签,则应重写__init__()方法:

class OfferRequestForm(forms.ModelForm):
    ...
    def __init__(self, *args, **kwargs):
        offer = kwargs.pop('offer')
        super(OfferRequestForm, self).__init__(*args, **kwargs)
        for field in offer._meta.fields:
            field_name = field.name
            form_field_name = field_name + 'Req'
            if form_field_name in self.fields:
                self.fields[form_field_name].label += \
                                u': %s' % getattr(offer, field_name)

所以现在必须将offer参数传递给OfferRequestForm的构造函数:

def offer_req(request, offer_id):
    offer = get_object_or_404(Offer, pk=offer_id)
    if request.method == 'POST':
        form  = OfferRequestForm(request.POST, offer=offer)
        if form.is_valid():
            offer_request = form.save(commit=False)
            offer_request.offerReq = offer
            offer_request.userReq = request.user
            offer_request.save()
            return redirect(offer_request)
    else:
        form  = OfferRequestForm(offer=offer)
    return render(request, 'offer_req.html', {'form': form})

相关问题 更多 >