Lớp không có thành viên đối tượng


154
def index(request):
   latest_question_list = Question.objects.all().order_by('-pub_date')[:5]
   template = loader.get_template('polls/index.html')
   context = {'latest_question_list':latest_question_list}
   return HttpResponse(template.render(context, request))

Dòng đầu tiên của hàm đó bị lỗi trên Question.objects.all():

E1101: Lớp 'Câu hỏi' không có đối tượng 'thành viên'

Tôi đang theo hướng dẫn tài liệu Django và họ có cùng mã đang chạy.

Tôi đã thử gọi một ví dụ.

Question = new Question()
and using MyModel.objects.all()

Ngoài ra models.pymã của tôi cho lớp đó là ...

class Question(models.Model):
question_text = models.CharField(max_length = 200)
pub_date = models.DateTimeField('date published') 

def was_published_recently(self):
    return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

def __str__(self):
    return self.question_text

Không có kết quả, tôi vẫn có lỗi này.

Tôi đã đọc về môn vị và chạy nó ...

pylint --load-plugins pylint_django

Điều đó không giúp được gì, ngay cả tập tin github readme cũng nói ...

Ngăn chặn các cảnh báo về các thuộc tính do Django tạo như Model.objects hoặc Views.request.

Tôi đã chạy lệnh trong virtualenv của tôi, nhưng không có gì.

Vì vậy, bất kỳ trợ giúp sẽ là tuyệt vời.


7
Sử dụngpylint --generated-members=objects
Raja Simon

Xin lỗi, đã chạy nó trong cmd của tôi và nó đã không thay đổi một điều.
mã hóa vào

phiên bản python và django của bạn là gì?
Gavin Achtemeier

1
verson python 3.6.0 và django 1.11.3
mã hóa vào

2
Đối với tôi, những gì đã giải quyết vấn đề là tạo một Managerthể hiện trong models.pytệp. Tham khảo tài liệu django để biết thêm.
Ikraj mohammad

Câu trả lời:


335

Cài đặt pylint-djangobằng cách sử dụng pipnhư sau

pip install pylint-django

Sau đó, trong Visual Studio Code goto: Cài đặt người dùng ( Ctrl+ ,hoặc Tệp> Tùy chọn> Cài đặt nếu có) Đặt vào phần sau (xin lưu ý các dấu ngoặc nhọn được yêu cầu cho cài đặt người dùng tùy chỉnh trong VSC):

{"python.linting.pylintArgs": [
     "--load-plugins=pylint_django"
],}

Cài đặt người dùng ở đâu
cegprakash

Chuyển đến Tệp-> Tùy chọn-> Cài đặt hoặc sử dụng "Ctrl + Dấu phẩy"
Sukma Saputra

29
Thông minh! Tôi cũng chỉ ra rằng bạn có thể đặt tùy chọn plugin trong một .pylintrctệp như vậy: load-plugins=pylint_django Và theo cách đó, CLI cũng sẽ được chọn, do đó, nó sẽ hoạt động trong cài đặt tích hợp liên tục.
sibnerian

Sau khi làm như vậy tôi nhận được [pylint] C0111:Missing module docstringlỗi
Vishnu Sharma

1
Thêm chi tiết trong tài liệu chính thức: code.visualstudio.com/docs/python/ trộm
Anton Danilchenko

98

@ tieuminh2510 câu trả lời là hoàn hảo. Nhưng trong các phiên bản mới hơn của VSC, bạn sẽ không tìm thấy tùy chọn để chỉnh sửa hoặc dán lệnh đó trong Cài đặt người dùng . Bây giờ trong phiên bản mới hơn để thêm mã đó, hãy làm theo các bước sau :

Nhấn ctr + sft + P để mở Bảng lệnh . Bây giờ trong bảng lệnh loại Tùy chọn: Cấu hình cài đặt ngôn ngữ cụ thể . Bây giờ chọn Python . Ở đây bên phải dán mã này

"python.linting.pylintArgs": [
        "--load-plugins=pylint_django",
    ]

Bên trong niềng răng xoăn đầu tiên. Hãy chắc chắn rằng pylint-django .

Hy vọng điều này sẽ giúp!


6
đừng quên đặt dấu phẩy vào tệp json nếu không, nó sẽ không hoạt động chính xác.
Georgi Stoyanov

4
Cũng đừng quên pip install pylint-django. Nếu tiện ích mở rộng không được cài đặt, thay đổi này đối với cài đặt của bạn dường như không hoạt động, phá vỡ mọi linting.
Dustin Michels

1
Cảm ơn bạn. Bạn có thể tìm thấy thông tin tương tự trong tài liệu chính thức của Mã VS tại đây: code.visualstudio.com/docs/python/ mẹo
Anton Danilchenko

Nó đã giải quyết lỗi trước đó. Nhưng, bây giờ một cảnh báo đang đến. Missing module docstringpylint(missing-module-docstring). Có thể làm gì cho việc này?
Optider

34

Cài đặt Django pylint:

pip install pylint-django

ctrl + shift + p> Tùy chọn: Định cấu hình Cài đặt ngôn ngữ cụ thể> Python

Các settings.json có sẵn cho ngôn ngữ python sẽ giống như dưới đây:

{
    "python.linting.pylintArgs": [
        "--load-plugins=pylint_django"
    ],

    "[python]": {

    }
}

26

Đây là câu trả lời. Nhận được từ bài đăng trên reddit của tôi ... https://www.reddit.com/r/django/comments/6nq0bq/ class_question_has_no_objects_member/

Đó không phải là một lỗi, đó chỉ là một cảnh báo từ VSC. Django bổ sung tính năng đó một cách linh hoạt cho tất cả các lớp mô hình (nó sử dụng rất nhiều phép thuật dưới mui xe), vì vậy IDE không biết về nó bằng cách xem khai báo lớp, vì vậy nó cảnh báo bạn về một lỗi có thể xảy ra (không phải vậy). trên thực tế, một đối tượng Manager giúp truy vấn DB. Nếu bạn thực sự muốn loại bỏ cảnh báo đó, bạn có thể đi đến tất cả các mô hình của mình và thêm các đối tượng = model.Manager () Bây giờ, VSC sẽ thấy các đối tượng được khai báo và sẽ không phàn nàn về nó nữa.


13
objects = models.Manager()trong lớp mô hình đã làm điều đó cho tôi trong VS Code. Cảm ơn.
Mallory-Erik

21

Tôi đã thử tất cả các giải pháp có thể được cung cấp nhưng không may cài đặt vscode của tôi sẽ không thay đổi đường dẫn kẻ nói dối. Vì vậy, tôi cố gắng khám phá cài đặt vscode trong cài đặt> Cài đặt người dùng> python . Tìm Linting: Pylint Path và thay đổi nó thành "pylint_django". Đừng quên thay đổi kẻ nói dối thành "pylint_django" tại cài đặt> Cài đặt người dùng> cấu hình python từ "pyLint" thành "pylint_django".

Đường dẫn Linter Chỉnh sửa


1
Làm việc cho tôi trên MacOS High Sierra và VSC 1.38, với điều kiện là trước đây tôi đã chạy "pip install pylint-django" trong môi trường ảo của mình.
Andrés Meza-Escallón

12

CẬP NHẬT CHO MÃ SỐ 1.40.0

Sau khi làm:

$ pip install pylint-django

Theo liên kết sau: https://code.visualstudio.com/docs/python/linting#_default-pylint-rules

Lưu ý rằng cách để pylintcó tài khoản pylint-djangolà bằng cách chỉ định:

"python.linting.pylintArgs": ["--load-plugins", "pylint_django"]

trong settings.jsonmã VS.

Nhưng sau đó, bạn sẽ nhận thấy rất nhiều lỗi linting mới. Sau đó, đọc những gì nó nói ở đây:

Các đối số này được truyền bất cứ khi nào python.linting.pylintUseMinimalCheckersđược đặt thành true(mặc định). Nếu bạn chỉ định một giá trị trong pylintArgshoặc sử dụng tệp cấu hình Pylint (xem phần tiếp theo), thì nó pylintUseMinimalCheckersđược đặt hoàn toàn thành false .

Những gì tôi đã làm là tạo một .pylintrctệp như được mô tả trong liên kết, và sau đó, đã định cấu hình các tham số sau trong tệp (để phần còn lại của tệp không bị ảnh hưởng):

load-plugins=pylint_django

disable=all

enable=F,E,unreachable,duplicate-key,unnecessary-semicolon,global-variable-not-assigned,unused-variable,binary-op-exception,bad-format-string,anomalous-backslash-in-string,bad-open-mode

Bây giờ pylinthoạt động như mong đợi.


Thay vì tạo một tệp .pylintrc riêng biệt, bạn có thể có được hiệu ứng tương tự bằng cách thực hiện điều này trong settings.json: {"python.linting.pylintArss": ["--load-plugins = pylint_django", "--disable = all "," --enable = F, E, không thể truy cập được, khóa trùng lặp, dấu chấm phẩy không cần thiết, biến toàn cục không được gán, biến không sử dụng, ngoại lệ nhị phân op, chuỗi định dạng xấu, dấu gạch chéo bất thường -Chuỗi, chế độ mở xấu "]}
sql_knievel

11

Bạn có thể thay đổi phần mở rộng cho phần mở rộng Python cho Visual Studio Code.

Trong VS mở Bảng lệnh Ctrl + Shift + P và nhập một trong các lệnh sau:

Python: Chọn Linter

Khi bạn chọn một kẻ nói dối, nó sẽ được cài đặt. Tôi đã thử flake8 và có vẻ như vấn đề đã được giải quyết cho tôi.


1
Trong khi điều này đã làm việc, tôi thấy flake8 thực sự gây phiền nhiễu như một kẻ nói dối.
Richard Dunn

4

Chỉ cần thêm vào những gì @ Mallory-Erik đã nói: Bạn có thể đặt objects = models.Manager()nó trong các chế độ:

class Question(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    # ...
    def __str__(self):
        return self.question_text
    question_text = models.CharField(max_length = 200)
    pub_date = models.DateTimeField('date published')
    objects = models.Manager()

3

Đầu tiên cài đặt pylint-django bằng lệnh sau

$ pip install pylint-django

Sau đó chạy lệnh thứ hai như sau:

$ pylint test_file.py --load-plugins pylint_django

--load-plugins pylint_django là cần thiết để xem xét chính xác mã django



1

Bằng cách thực hiện Question = new Question()(tôi giả sử đó newlà một lỗi đánh máy), bạn đang ghi đè lên mô hình Câu hỏi với một ý định Question. Giống như Sayse đã nói trong các bình luận: không sử dụng cùng tên cho biến của bạn làm tên của mô hình. Vì vậy, thay đổi nó để một cái gì đó như my_question = Question().


Đó là một cái gì đó với cấu hình pc của tôi là django và pytho, tôi đã mã hóa lại nó trên macbook của tôi và nó hoạt động tốt. Ngoài ra tôi đã thử đề nghị của bạn trong mã của tôi và nó không có sự khác biệt.
mã hóa vào

1

Làm thế nào về việc khắc phục lỗi trên từng dòng cụ thể cho từng lỗi?

Một cái gì đó như thế này: https://pylint.readthedocs.io/en/latest/user_guide/message-control.html

Lỗi: [pylint] Lớp 'class_name' không có thành viên 'thành viên' Nó có thể bị chặn trên dòng đó bằng cách:

  # pylint: disable=no-member

2
Là vũ phu như giải pháp này, đó là cách duy nhất để giữ gìn sự tỉnh táo của một người. Tôi đang gặp phải những lỗi đó trên hàng tá mô-đun khác nhau, tôi sẽ không thay đổi cài đặt mỗi khi tôi thấy một mô-đun mới.
Przemek D


0

Vấn đề này xảy ra khi tôi sử dụng pylint_runner

Vì vậy, những gì tôi làm là mở tệp .pylintrc và thêm cái này

# List of members which are set dynamically and missed by pylint inference
# system, and so shouldn't trigger E1101 when accessed. Python regular
# expressions are accepted.
generated-members=objects

0

Tôi đã có thể cập nhật người dùng settings.json

Trên máy mac của tôi, nó được lưu trữ trong:

~/Library/Application Support/Code/User/settings.json

Trong đó, tôi đặt như sau:

{
    "python.linting.pycodestyleEnabled": true,
    "python.linting.pylintEnabled": true,
    "python.linting.pylintPath": "pylint",
    "python.linting.pylintArgs": ["--load-plugins", "pylint_django"]
}

Điều đó đã giải quyết vấn đề cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.