2012-12-08 69 views
4

我有一个模型属性和产品,声明如下:Django的 - 建立多至2种型之间有很多的关系,而无需通过表使用表单集

class Attribute(models.Model): 
    value = models.TextField() 
    owner = models.ForeignKey(User) 
    type = models.ForeignKey(AttributeType)  
    image = ImageField(upload_to='attributes', null=True, blank=True)  
    related_attribute = models.ManyToManyField('self', blank = True, null = True) 

class BaseWorkspace(models.Model): 
    name = models.CharField(max_length=255) 
    owner = models.ForeignKey(User) 
    attributes = models.ManyToManyField('Attribute', blank = True, null = True) 
    created = CreationDateTimeField() 
    modified = ModificationDateTimeField() 
    comments = models.ManyToManyField('Comment', blank = True, null = True) 
    sort_order = models.IntegerField(blank = True) 

class Product(BaseWorkspace): 
    project = models.ForeignKey('Project', related_name='products') 

如何使用表单集我建立的M-M的关系?我曾尝试模型表单集工厂是这样的:

AttributeFormset = modelformset_factory(Attribute, form=AttributeForm) 

与通用鉴于这种功能:

def form_valid(self, form): 
     f = form.instance 
     f.sort_order = Product.default_sort_order() 
     f.owner = self.request.user 
     f.project = get_object_or_404(Project, pk=self.kwargs['pk']) 
     context = self.get_context_data() 
     attribute_form = context['attribute_form'] 
     if attribute_form.is_valid(): 
      self.object = form.save() 
      attribute_form.instance = self.object 
      attribute_form.save() 
      return HttpResponseRedirect(reverse(self.get_success_url())) 
     else: 
      return self.render_to_response(self.get_context_data(form=form)) 

,但我无法得到它的工作。有任何想法吗?

+0

你知道哪一行失败吗?你能提供一个堆栈跟踪吗?它可能是调用通用视图方法的顺序 - 在form_valid()被调用时实际上是否存在一个context ['attribute_form']'变量? –

+0

所以你只是想显示一个属性列表来分配产品?类似于用户表单在django管理员中显示组的方式? –

+0

我想创建附加到产品的属性,全部以一种形式。 – yretuta

回答

0

尝试这样:

from django.forms.models import modelformset_factory 
def my_view_function(request) : 

    # not sure where the product whose formset we are working on comes from 
    product = <whatever> 

    AttributeFormSet = modelformset_factory(Attribute) 

    if request.method == "POST" : 
     # POST bound formset 
     formset = AttributeFormSet(request.POST, queryset=Attribute.objects.filter(product=product)) 
     # If the entire formset is valid 
     if formset.is_valid() : 
      for form in formset: 
       # Save each form in the set 
       b = form.save() 
     else : 
      #There was an error (add a message using the messages framework?) 
      pass 
    else : 
     # initial formset w/o post 
     formset = AttributeFormSet(queryset=Attribute.objects.filter(product=product)) 

    ... 

同类很难给你更具体的答案,我想如果你正在使用基于类的观点,我们需要整个视图功能或视图类。

在你的模板中,像这样简单的东西(来自文档)应该这样做。

<form method="post" action=""> 
    {{ formset.management_form }} 
    <table> 
     {% for form in formset %} 
     {{ form }} 
     {% endfor %} 
    </table> 
</form> 

如果需要的形式在运行时添加到该formset W/JavaScript的看看这个能力:http://code.google.com/p/django-dynamic-formset/。我从未使用过它,但至少它看起来像是朝着正确方向迈出的一步。

EDIT

首先排除产物从该formset

AttributeFormSet = modelformset_factory(Attribute, exclude=('product',)) 

然后改变表单处理块不是保存提交和手动附加的产物。

 if formset.is_valid() : 
      for form in formset: 
       # get this form's instance 
       b = form.save(commit=False) 
       # attach product 
       b.product = product 
       # save the instance 
       b.save() 
+0

我将如何将属性链接到产品? – yretuta

+0

请参阅我的编辑附加属性保存产品 –

+0

也我回答了另一个有点类似的问题:http://stackoverflow.com/a/13686524/884453 –

0

通过使用f = form.instance您可以访问原始实例。如果attribute_form有效,则调用form上的保存方法,而不是f。您在f上所做的所有更改都将丢失。

看看saving-objects-in-the-formset如何在保存formset之前更新formset的实例。

相关问题