django从视图调用外部api

django从视图调用外部api,django,django-class-based-views,Django,Django Class Based Views,我试图从基于类的视图调用外部api。 目前,我有以下调用API的视图。然而,目前我只是用API(用户名、密码)调用API,它返回数据,但不保存数据 如何将视图中modelform中使用的模型传递给api函数,以便它可以将返回的数据保存给相关用户。(即我需要在CBV中重写什么方法) 另外,在django中调用外部api的最佳方法是什么(从表单完成开始)。目前,API往返需要5-10秒,在设置的时候,它会延迟下一页的加载 class SupplierOnlineAccountView(CreateV

我试图从基于类的视图调用外部api。 目前,我有以下调用API的视图。然而,目前我只是用
API(用户名、密码)
调用API,它返回数据,但不保存数据

如何将视图中modelform中使用的模型传递给api函数,以便它可以将返回的数据保存给相关用户。(即我需要在CBV中重写什么方法)

另外,在django中调用外部api的最佳方法是什么(从表单完成开始)。目前,API往返需要5-10秒,在设置的时候,它会延迟下一页的加载

class SupplierOnlineAccountView(CreateView):
    form_class = SupplierOnlineAccountForm
    template_name = 'standard_form.html'
    success_url = '../contacting'

    def form_valid(self, form):
        username = form.cleaned_data.get('username')
        password = form.cleaned_data.get('password')
        api(username, password)
        return super().form_valid(form)
型号:

class EUser(models.Model):
    username = models.CharField(max_length=255, null=True)
    password = models.CharField(max_length=255, null=True)
    address = models.ForeignKey(Address, null=True)
    temp_user = models.CharField(max_length=255, null=True)
    user = models.OneToOneField(settings.AUTH_USER_MODEL, null=True, default=None)
    title = models.CharField(max_length=10)
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
您必须将title、first\u name、last\u name字段更改为blank=True,以便在api调用之前保存,然后传递保存的模型


对于API的等待时间问题,这是一个典型的异步任务,用于类似芹菜的队列。保存表单,然后将任务卸载到队列,队列在另一个线程(或进程或机器)上运行。django无需等待api返回并发送响应。

您能否详细说明您到底想做什么:您得到什么数据,您想保存在哪里?谢谢,我正在尝试将返回的api数据保存在Euser模型中。SupplierOnlineAccountForm还保存到Euser模型。Api返回名字、姓氏等。。。以及其他要保存在EUser模型中的数据。好的,更新了答案。谢谢,我现在在ModelFormMixin中看到了。是否有一种方法不先保存,但仍将要保存的对象传递给它,例如在基于函数的视图中的
instance=form.save(commit=False)
?我更愿意避免在api将保存到的所有字段中输入blank=True,因为最终可能会有很多字段。可以,但最好先保存到db,特别是在它进入外部api之前。只是想了解为什么在进入api之前先保存更好?一旦您将api卸载到另一个线程或队列以节省时间,那么如果api失败,您仍然可以在DB中保存该对象。
def form_valid(self, form):
    username = form.cleaned_data.get('username')
    password = form.cleaned_data.get('password')
    self.object = form.save()
    api(username, password,self.object)
    return super().form_valid(form)