0

oscar のドキュメントに従って、ダッシュボードから複数のディーラーのサポートを追加したいと思います。

すべての製品で StockRecord の作成を強制する必要があります。Product が作成されると、Stockrecord.partner が self.request.user.partner (必要に応じて作成) に設定されるため、接続が確立されます。

StockRecord の作成を強制する方法がわかりません。oscar には、django admin を置き換えるダッシュボードがあります。これは、製品の作成/更新に使用されるビューの抜粋 (最初の行) です。

class ProductCreateUpdateView(generic.UpdateView):
    """
    Dashboard view that bundles both creating and updating single products.
    Supports the permission-based dashboard.
    """

    template_name = 'dashboard/catalogue/product_update.html'
    model = Product
    context_object_name = 'product'

    form_class = ProductForm
    category_formset = ProductCategoryFormSet
    image_formset = ProductImageFormSet
    recommendations_formset = ProductRecommendationFormSet
    stockrecord_formset = StockRecordFormSet

したがって、製品作成ビューには StockRecord フォームセットが表示されますが、StockRecord オブジェクトを作成せずに製品を作成/更新できます。このような場合にエラー メッセージを表示したいと考えています。

StockRecord フォーム/フォームセット:

class StockRecordForm(forms.ModelForm):

    def __init__(self, product_class, *args, **kwargs):
        super(StockRecordForm, self).__init__(*args, **kwargs)


        # If not tracking stock, we hide the fields
        if not product_class.track_stock:
            del self.fields['num_in_stock']
            del self.fields['low_stock_threshold']
        else:
            self.fields['price_excl_tax'].required = True
            self.fields['num_in_stock'].required = True

    class Meta:
        model = StockRecord
        exclude = ('product', 'partner', 'num_allocated')


BaseStockRecordFormSet = inlineformset_factory(
    Product, StockRecord, form=StockRecordForm, extra=1)


class StockRecordFormSet(BaseStockRecordFormSet):

    def __init__(self, product_class, *args, **kwargs):
        self.product_class = product_class
        super(StockRecordFormSet, self).__init__(*args, **kwargs)

    def _construct_form(self, i, **kwargs):
        kwargs['product_class'] = self.product_class
        return super(StockRecordFormSet, self)._construct_form(
            i, **kwargs)

StockRecord モデル (抜粋):

class AbstractStockRecord(models.Model):

    product = models.ForeignKey(
        'catalogue.Product', related_name="stockrecords",
        verbose_name=_("Product"))
    partner = models.ForeignKey(
        'partner.Partner', verbose_name=_("Partner"),
        related_name='stockrecords')

    partner_sku = models.CharField(_("Partner SKU"), max_length=128)
    price_currency = models.CharField(
        _("Currency"), max_length=12, default=settings.OSCAR_DEFAULT_CURRENCY)

    price_excl_tax = models.DecimalField(
        _("Price (excl. tax)"), decimal_places=2, max_digits=12,
        blank=True, null=True)

    price_retail = models.DecimalField(
        _("Price (retail)"), decimal_places=2, max_digits=12,
        blank=True, null=True)
4

1 に答える 1

1

メイン フォームを保存するときに、少なくとも 1 つの有効なフォームセットが送信されていることを確認してください。

于 2014-01-29T18:09:40.327 に答える