【问题标题】:Django: How to submit a form to either create new object or get an existing one?Django:如何提交表单以创建新对象或获取现有对象?
【发布时间】:2018-01-07 17:11:02
【问题描述】:

使用django1.11.4

我正在尝试创建一个用于将项目添加到数据库的页面,但是,为此,我需要创建/获取几个不同的对象(产品、制造商、供应商),它们的形式构成了整体的一部分添加项目的表单。

在大多数情况下,会有现有的产品、制造商和供应商。所以我想检索现有对象并将其用作相关表单的外键。例如制造商是产品的外键。

但是,当我尝试提交现有对象的详细信息时,对于所有表单。例如供应商。 is_valid 失败。错误是:<ul class="errorlist"><li>supplier_name<ul class="errorlist"><li>Supplier with this Supplier name already exists.</li></ul></li></ul>

有没有办法提交带有“现有数据”的表单,以便我可以作为外键传递。

感谢您的宝贵时间。

class SupplierTestCase(FormTestCase, BasicTests):
@classmethod
def setUpTestData(cls):
    super(SupplierTestCase, cls).setUpTestData()
    cls.form = SupplierForm

def setUp(self):
    super(SupplierTestCase, self).setUp()
    self.data = {'supplier_name_text': self.supplier_name}
    self.blank_data = {
        'supplier_name_text': ['This field is required.']
    }

def test_valid_data(self):
    form = self.form(self.data)
    self.assertTrue(form.is_valid())
    commit = form.save()
    self.assertEqual(commit.supplier_name_text, self.supplier_name)

def test_get_data(self):
    form = self.form(self.data)
    self.assertTrue(form.is_valid())
    if form.is_valid():
        commit = form.save()
        self.assertEqual(commit.supplier_name_text, self.supplier_name)

    form = self.form(self.data)
    #The problem is below vvvv
    self.assertTrue(form.is_valid())
    if form.is_valid():
        commit = form.save(commit=False)
        data = model_to_dict(commit)
        get, created = Supplier.objects.get_or_create(supplier_name_text=data.get('supplier_name_text'))
        self.assertFalse(created)

型号

class Supplier(models.Model):
    """
    The Supplier
    """
    supplier_name = models.CharField(max_length=200, unique=True)

    def __str__(self):
        return self.name_text

【问题讨论】:

  • 请您的型号!
  • @rakwen 没问题,给我一点时间
  • 好的,我在等! . . .
  • 我的回答对你有帮助吗?
  • 谢谢@rakwen。如果我删除unique = True,正如你所说,我将有多个同名供应商,是否可以保留unique = True,因为我最终会在我的数据库中重复,或者删除unique = True是唯一的解决方案?

标签: django dry


【解决方案1】:
class Supplier(models.Model):
    """
    The Supplier
    """
    name_text = models.CharField(max_length=200, unique=True <<<------- Take a look)

    def __str__(self):
        return self.name_text

您在提供的名称中有 unique=True 这意味着您不能添加两个提供的同名

【讨论】:

  • OP 不希望有两个具有相同名称的项目,这就是问题的重点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-01
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
相关资源
最近更新 更多