【问题标题】:Django get error : id() takes exactly one argument (0 given) ,save with foreign keyDjango 出错:id() 只接受一个参数(给定 0),用外键保存
【发布时间】:2019-02-03 15:34:59
【问题描述】:

所以我有一个关于如何使用外键关系保存模型实例的问题,

models.py

class Connect(models.Model):
    username = models.CharField(max_length=255)
    password = models.CharField(max_length=255,null=True, blank=True)
    conft = models.TextField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return unicode(self.username)


class Ip(models.Model):
    class Meta:
        db_table = 'autonet_ip'

    connect_id = models.ForeignKey(Connect, on_delete=models.CASCADE)
    ipaddr = models.CharField(max_length=255)

    def __str__ (self):
        return self.ipaddr

forms.py

class NacmForm(ModelForm):
    password = forms.CharField(widget=forms.PasswordInput,required = False)
    class Meta:
        model = Connect
        fields = ['username', 'password','conft']

    labels = {'conft':_('Config'),}

class IpForm(ModelForm):

    class Meta:
        model = Ip
        fields = ['ipaddr']
    labels = {'ipaddr':_('IP address'),}


IpFormset = formset_factory(IpForm,  extra=1)

views.py

def konfig(request):
    ip_list = []
    status = ''
    value_bak = 1

    if request.method == 'POST':
        formm = NacmForm(request.POST or None)
        ipform = IpFormset(request.POST)
        upform = UploadForm(request.POST,request.FILES)
        userValue = formm['username'].value()
        passValue = formm['password'].value()
        confValue = formm['conft'].value()
        usernamef = get_object_or_404(Connect, pk=id)
        if ipform.is_valid():
            for form in ipform:
                ipaddr = form.cleaned_data.get('ipaddr')

                //.... some code ...//

                simpanIp = form.save(commit=False)
                simpanIp.connect_id = usernamef
                simpanIp.save()

            simpanForm.save()

        return HttpResponseRedirect('/konfig')
    else:
        formm = NacmForm()
        ipform = IpFormset()
        return render(request, 'konfig.html', {'form': formm, 'logins': Connect.objects.all(), 'ipform': ipform, 'status': status })

然后,当我输入所有数据并单击提交以收集表单数据时,在simpanIp.save() 上出现错误:id() takes exactly one argument (0 given).

我只是想知道如何使用外键将Connect模型的实例保存到数据库中,提前谢谢


所以我像这样编辑我的models.py

class Connect(models.Model):
......
        def get_usernameinf(self):
            return ', '.join(self.usernameinf.all().values_list('username', flat=True))

和views.py这样的

if request.method == 'POST':
.....some code.....

if ipform.is_valid() and formm.is_valid():
    simpanForm = formm.save()

    for form in ipform:
    simpanIp = form.save(commit=False)
    ...... some code ..
        simpanIp.connect_id = simpanForm
        simpanIp.save()

它的工作,现在结果是我的“connect_id”从“Connect id”获得了价值

【问题讨论】:

  • 发布完整的回溯。但是您传递给 get_object_or_404 的 id 是什么?

标签: python django


【解决方案1】:

id 是一个 Python 内置函数,可为对象提供唯一 ID。我猜你不打算在这一行传递get_object_or_404:

get_object_or_404(Connect, pk=id)

此函数的调用约定似乎是它是数据库表中主键的整数。找出应该从哪里获取主键并正确设置它。

专业提示:避免使用 Python 预定义的名称(完整列表请参见 here)。它可能会导致像你刚才那样的头痛。

【讨论】:

  • 感谢您的回答,我没有再次使用 get_object_or_404(Connect, pk=id),我已经编辑了帖子,它的工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 2023-03-23
  • 2017-01-15
  • 2017-03-27
相关资源
最近更新 更多