2015-02-10 16 views
0

根据我的知识,无论何时我们创建表格,它都会从表格中提取表格并将其保存到同一个表格中。 例如:如何从特定的表格中创建表格并将其保存到不同的表格

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

这里ExampleFormExample模式形成,一旦提交它保存回Example模型。 我想要的是,我想从表中开发一个表单并将其保存到另一个表中? 这可能吗?

为什么我要这个?

因为,我创建一个表单,仅包含复选框,这些复选框的标签从表中检索,但我想用户输入保存到一个不同的表

models.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 

forms.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形式时,其呈现为如下所示:

()折扣
()运输
() nextTrip
()反应
()奖励积分

,但我想要的是:

()折扣:3%
()交通:FREE
()nextTrip:20%
()refferals:是
()奖励积分:200

上述表格输出可以呈现,如果窗体是从Offer模式,因为不同的优惠都在Offer模型

现在,当这种形式(来自Offer派生)提交定义,我希望它得到保存在OfferRequest


尽我所能来解释,确实问不清楚。

+0

创建从另一个表的另一种形式。在处理'POST'时保存数据,使用第二种形式。 – Rohan 2015-02-10 10:33:13

+0

你能否让它更清楚一点。我了解第二部分关于如何在处理POST时使用第二种形式。如果你可以举一个例子给出一个代码段 – dreamer 2015-02-10 10:39:46

+0

没有得到你想要的。我看到'OfferRequestForm'是从'OfferRequest'创建的,而不是'Offer'。可能你的意思是你想在保存“OfferRequestForm”的同时将'OfferRequest.offerReq'设置为某个'Offer'模型? – catavaran 2015-02-10 12:21:45

回答

0

如果你想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}) 
+0

我有点新的Django,所以这将是很好,如果ü可以解释第一部分或者至少指出需要一些参考理解 – dreamer 2015-02-12 01:29:23

+0

model._meta'的'好解释:http://www.b-list.org/weblog/2007/nov/04/working-models/所以我们迭代模型的字段和检查' Req'字段存在于表单中('self.fields'是表单字段的列表)。如果这样的领域存在,那么我们改变它的标签。 – catavaran 2015-02-12 01:55:35

相关问题