TabError:缩进中制表符和空格的使用不一致 - 集成 MailChimp Django

Posted

技术标签:

【中文标题】TabError:缩进中制表符和空格的使用不一致 - 集成 MailChimp Django【英文标题】:TabError: inconsistent use of tabs and spaces in indentation - Integration MailChimp Django 【发布时间】:2019-10-05 05:13:51 【问题描述】:

我刚刚使用AjaxMailchimp 集成到我的Django 项目中。电子邮件地址字段工作正常,我可以在我的 Mailchimp 列表和数据库中获取电子邮件。现在,当我尝试添加一个允许用户将他的名字添加到表单的字段时,我不断收到类似这样的错误,例如:from .utils import SendSubscribeMail File "C:\Users\locq\Desktop\Coding\SEARCH_APP\venv\src\search\utils.py", line 8 self.fname = fname ^ TabError: inconsistent use of tabs and spaces in indentation..

那么如何添加 FNAME 字段并在提交时将数据发送到 mailchimp?

这是我的代码:

在我的 Settings.p 中,我在底部添加了我的 Mailchimp 凭据,如下所示:

MAILCHIMP_API_KEY = '767ba************-us6'
MAILCHIMP_SUBSCRIBE_LIST_ID = '45c*******'

我创建了一个 utils.py 文件来使用 Threading、Mailchimp 包并从设置中导入我的凭据:

import threading
import mailchimp
from django.conf import settings

class SendSubscribeMail(object):
    def __init__(self, email, fname):
        self.email = email
        self.fname = fname
        thread = threading.Thread(target=self.run, args=())
        thread.daemon = True
        thread.start()

    def run(self):
        API_KEY = settings.MAILCHIMP_API_KEY
        LIST_ID = settings.MAILCHIMP_SUBSCRIBE_LIST_ID
        api = mailchimp.Mailchimp(API_KEY)
        try:
            api.lists.subscribe(LIST_ID, 'email': self.email, merge_vars='FNAME': self.fname, double_optin=False)
        except:
            return False

自定义 Def 获取输入名称:

def subscribe(request):
    if request.method == 'POST':
        fname = request.POST['fname_id']
        Subscribe.objects.create(fname_id = fname)
        email = request.POST['email_id']
        email_qs = Subscribe.objects.filter(email_id = email)
        if email_qs.exists():
            data = "status" : "404"
            return JsonResponse(data)
        else:
            Subscribe.objects.create(email_id = email)
            SendSubscribeMail(email, fname) # Send the Mail, Class available in utils.py
    return HttpResponse("/")

我用来在我的数据库的订阅表中添加电子邮件(和 fname)的 models.py:

class Subscribe(models.Model):
    email_id = models.EmailField()
    fname_id = models.CharField(max_length=255, blank=True, null=True, default='')
    timestamp = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.email_id

我的html表单:

<div class="signup subs-form">

  <div class="header">
    <p>Sign Up For Beta</p>
  </div>
  <div class="description">
    <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna.</p>
  </div>

  <form method="POST" id="subscribe" class="subs-form">
    % csrf_token %
    <div>
      <input type="email" class="button-" id="email" name="email_id" placeholder="E-mail">
      <div class="input">
        <input type="text" class="button-" id="fname" name="fname_id" placeholder="First Name">
        <input type="submit" class="button-" id="submit" value="Join">
      </div>
    </div>
  </form>

</div>

最后,这是我页面底部的 Ajax 代码:

  $('#subscribe').submit(function(e)
      e.preventDefault();
      var email_id = $("#email").val();
      if(email_id)
        var csrfmiddlewaretoken = csrftoken;
        var fname_id = $("#fname").val();
        var email_data = "email_id": email_id,
                          "fname_id": fname_id,
                          "csrfmiddlewaretoken" : csrfmiddlewaretoken;
        $.ajax(
          type : 'POST',
          url :  '/subscribe/',
          data : email_data,
          success : function(response)
            $('#email').val('');
            if(response.status == "404")
              alert("This Email is already been subscribed!");
            
            else
              alert("Thank you for Subscribing! Please Check your Email to Confirm the Subscription");
            
          ,
          error: function(response) 
            alert("Sorry Something went Wrong");
            $('#email').val('');
          
        );
        return false;
      
      else
        alert("Please provide correct email!");
      
  );


function getCookie(name) 
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') 
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) 
            var cookie = jQuery.trim(cookies[i]);
            if (cookie.substring(0, name.length + 1) === (name + '=')) 
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            
        
    
    return cookieValue;

var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();

function csrfSafeMethod(method) 
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));

$.ajaxSetup(
    beforeSend: function(xhr, settings) 
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) 
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        
    
)

我怎样才能做到这一点?

【问题讨论】:

正如错误所说,您的某些行使用带空格的缩进,其他行使用制表符等,因此不一致。它与 mailchimp 无关,...本身。 感谢您的快速回答!那么我可以修复缩进吗? 您查看代码块,了解行的缩进方式并协调它们。例如,将所有内容放在空格中。 我不明白,我试过用空格,但我一直收到错误.. 见here。 【参考方案1】:

根据python文档,python不能混合使用制表符和空格进行缩进,根据PEP-8,每个缩进级别应该使用四个空格。当我尝试这样做时,这是真的:

>>> for i in range(20):
    'indent with tabs'
    'indent with spaces'

SyntaxError: inconsistent use of tabs and spaces in indentation

如果你有一个 python IDE,而不只是将它们写入,比如记事本或 TextEdit,它应该将每个制表符转换为四个空格,或者(不推荐,因为 PEP-8)每 4 个四个空格到一个制表符。

编辑:您可以使用Ctrl+H 组合来查找/替换每个带有 4 个空格的选项卡(这不会影响您的实际代码;字符串中的选项卡应该是 '\t'

【讨论】:

刚试用了新模块,感觉比我给的方法好多了:)

以上是关于TabError:缩进中制表符和空格的使用不一致 - 集成 MailChimp Django的主要内容,如果未能解决你的问题,请参考以下文章

我可以导入 waipy

Python对缩进制表符和空格的解释

Eclipse:使用制表符和空格进行缩进

python基础---流程控制

python错误提示“TabError: inconsistent use of tabs and spaces in indentation”

10秒看完为什么缩进不用TAB而是4个空格,IDEA设置TAB按键为4个空格方法