【问题标题】:Django Foreign key in hidden form field隐藏表单字段中的Django外键
【发布时间】:2023-03-26 04:04:01
【问题描述】:

我想在从视图中的模型创建的表单中隐藏外键字段。 这是模型:

class Order(models.Model):
    class Meta:
        ordering = ['unity_price']
    item = models.ForeignKey(Item, on_delete=models.CASCADE)
    user = models.ForeignKey(authModels.User, on_delete=models.CASCADE, default=1)
    order_quantity = models.IntegerField(default=0)
    unity_price = models.FloatField(default=0)
    end_validity_date = models.DateTimeField(default=timezone.now() + datetime.timedelta(days=30))
    is_sell = models.BooleanField(default=True)

    def __str__(self):
        if self.is_sell:
            return 'sell ' + str(self.order_quantity) + ' ' + self.item.item_text + ' at ' + str(self.unity_price)
        return 'buy ' + str(self.order_quantity) + ' ' + self.item.item_text + ' at ' + str(self.unity_price)

这是表格:

from .models import Order

class OrderForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(OrderForm, self).__init__(*args, **kwargs)
        self.fields['user'].widget = HiddenInput()
        self.fields['item'].widget = HiddenInput()

    class Meta:
        model = Order
        fields = ('item', 'user', 'order_quantity', 'unity_price', 'end_validity_date', 'is_sell',)

这是视图:

class DetailView(FormMixin, generic.DetailView):
    model = Item
    template_name = 'bourse/detail.html'
    form_class = OrderForm

    def get_success_url(self):
        return reverse('bourse:detail', kwargs={'pk': self.object.id})

    def get_context_data(self, **kwargs):
        context = super(DetailView, self).get_context_data(**kwargs)
        context['form'] = OrderForm(initial={'post': self.object})
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form = self.get_form()
        form.fields['item'].initial = self.get_object()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

    def form_valid(self, form):
        model_instance = form.save(commit=False)
        model_instance.user = self.request.user
        model_instance.item = self.get_object()
        print (model_instance.item)
        model_instance.save()
        return super(DetailView, self).form_valid(form)

它适用于字段“用户”,但不适用于字段“项目”。我不知道在 model_instance.item (应该是当前视图显示的对象)或 form.fields['item'].initial (也应该是当前视图的对象)中放入什么。

问候,

【问题讨论】:

    标签: django forms foreign-keys


    【解决方案1】:

    从模型表单元中的字段中取出外键项。这些是将传递到您的表单的字段。所以采取:

     class Meta:
        model = Order
        fields = ('item', 'user', 'order_quantity', 'unity_price', 'end_validity_date', 'is_sell',)
    

    并且只使用:

    class Meta:
            model = Order
            fields = ('order_quantity', 'unity_price', 'end_validity_date', 'is_sell',)
    

    如果您需要,可以通过 form_valid 将这些值放回原处。

    【讨论】:

    • So : def get_context_data(self, **kwargs): 不再需要,因为 line :form.fields['item'].initial = self.get_object()
    • 再看一遍,我不确定您为什么要使用详细视图。为什么不使用创建视图或更新视图?这些是为处理表格而设计的。最后,是的,我认为您可以将其删除,因为您使用 form_class= ... 声明表单,并且基于类的视图应该处理该实例。
    • 我使用 DetailView 来显示有关商品的信息,并在此视图中使用表单来创建订单。 DetailView 不是设计用来在 SQL 表中显示一行的吗?
    • 我没有意识到你也在使用它来做到这一点。应该没问题的。
    【解决方案2】:

    实际上错误出现在:

    def get_context_data(self, **kwargs):
        context = super(DetailView, self).get_context_data(**kwargs)
        context['form'] = OrderForm(initial={'item': self.object})
        return context
    

    我需要设置'item'的初始值,而不是'post'!

    【讨论】:

      猜你喜欢
      • 2010-10-11
      • 2019-01-03
      • 2010-09-30
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      相关资源
      最近更新 更多