La classe n'a aucun membre d'objets

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))

La première ligne de cette fonction obtient une erreur sur Question.objects.all():

E1101: La classe 'Question' n'a aucun objet 'membre'

Je suis le tutoriel de documentation de Django et ils ont le même code opérationnel.

J'ai essayé d'appeler une instance.

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

Aussi mon models.pycode pour cette classe est ceci ...

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

En vain, j'ai toujours cette erreur.

J'ai lu sur pylint et ai couru ceci ...

pylint --load-plugins pylint_django

Ce qui n'a pas aidé, même si le fichier readme de github dit ...

Empêche les avertissements concernant les attributs générés par Django tels que Model.objects ou Views.request.

J'ai exécuté la commande dans mon virtualenv, et pourtant rien.

Donc, toute aide serait formidable.

buuencrypted
la source
7
Utilisationpylint --generated-members=objects
Raja Simon
Désolé, je l'ai exécuté dans mon cmd et cela n'a rien changé.
buuencrypted le
quelle est votre version de python et django?
Gavin Achtemeier
1
verson python 3.6.0 et django 1.11.3
buuencrypted le
2
Pour moi, ce qui a résolu le problème était de créer une Managerinstance dans le models.pyfichier. Reportez-vous à la documentation de django pour plus d'informations.
Ikraj mohammad

Réponses:

335

Installer en pylint-djangoutilisant pipcomme suit

pip install pylint-django

Ensuite, dans Visual Studio Code, allez à: Paramètres utilisateur ( Ctrl+ ,ou Fichier> Préférences> Paramètres si disponible) Mettez ce qui suit (veuillez noter les accolades requises pour les paramètres utilisateur personnalisés dans VSC):

{"python.linting.pylintArgs": [
     "--load-plugins=pylint_django"
],}
tieuminh2510
la source
où est les paramètres utilisateur
cegprakash
Allez dans Fichier-> Préférences-> Paramètres ou utilisez "Ctrl + Virgule"
Sukma Saputra
29
Excellent! Je soulignerais également que vous pouvez mettre l'option plugin dans un .pylintrcfichier comme ceci: load-plugins=pylint_django et de cette façon, il sera également repris par la CLI, donc cela fonctionnerait dans un cadre d'intégration continue.
sibnerian
Après cela, je reçois une [pylint] C0111:Missing module docstringerreur
Vishnu Sharma
1
Plus de détails dans la doc officielle: code.visualstudio.com/docs/python/…
Anton Danilchenko
97

La réponse @ tieuminh2510 est parfaite. Mais dans les versions plus récentes de VSC, vous ne trouverez pas l'option pour modifier ou coller cette commande dans les paramètres utilisateur . Maintenant, dans une version plus récente pour ajouter ce code, procédez comme suit :

Appuyez sur ctr + sft + P pour ouvrir la palette de commandes . Maintenant, dans le type de palette de commandes Préférences: Configurez les paramètres spécifiques à la langue . Sélectionnez maintenant Python . Ici, à droite, collez ce code

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

À l'intérieur des premières accolades. Assurez-vous que pylint-django .

J'espère que cela aidera!

FightWithCode
la source
6
n'oubliez pas de mettre une virgule dans le fichier json sinon cela ne fonctionnera pas correctement.
Georgi Stoyanov
4
N'oubliez pas non plus pip install pylint-django. Si l'extension n'est pas installée, cette modification de vos paramètres semble échouer silencieusement, brisant toutes les peluches.
Dustin Michels
1
Je vous remercie. Vous pouvez trouver les mêmes informations dans la documentation officielle de VS Code ici: code.visualstudio.com/docs/python/…
Anton Danilchenko
Il a résolu l'erreur précédente. Mais, maintenant, un avertissement arrive. Missing module docstringpylint(missing-module-docstring). Que peut-on faire pour cela?
Optider le
34

Installez Django pylint:

pip install pylint-django

ctrl + shift + p> Préférences: configurer les paramètres spécifiques au langage> Python

Le settings.json disponible pour le langage python devrait ressembler à ce qui suit:

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

    "[python]": {

    }
}
user3785966
la source
26

Voici la réponse. Obtenu de mon post reddit ... https://www.reddit.com/r/django/comments/6nq0bq/class_question_has_no_objects_member/

Ce n'est pas une erreur, c'est juste un avertissement de VSC. Django ajoute cette propriété dynamiquement à toutes les classes de modèle (il utilise beaucoup de magie sous le capot), de sorte que l'EDI ne le sait pas en regardant la déclaration de classe, donc il vous avertit d'une erreur possible (ce n'est pas le cas). objets est en fait une instance de Manager qui aide à interroger la base de données. Si vous voulez vraiment vous débarrasser de cet avertissement, vous pouvez accéder à tous vos modèles et ajouter objets = models.Manager () Maintenant, VSC verra les objets déclarés et ne s'en plaindra plus.

buuencrypted
la source
13
objects = models.Manager()dans la classe des modèles l'a fait pour moi dans VS Code. Merci.
Mallory-Erik
22

J'ai essayé toutes les solutions possibles proposées mais malheureusement, mes paramètres de vscode ne changeront pas son chemin de linter. Donc, je cherche à explorer les paramètres de vscode dans paramètres> Paramètres utilisateur> python . Trouvez Linting: Pylint Path et changez-le en "pylint_django". N'oubliez pas de changer le linter en "pylint_django" dans les paramètres> Paramètres utilisateur> configuration python de "pyLint" à "pylint_django".

Modifier le chemin du linter

Willy satrio nugroho
la source
1
A travaillé pour moi sur MacOS High Sierra et VSC 1.38, à condition qu'auparavant j'exécute "pip install pylint-django" dans mon environnement virtuel.
Andrés Meza-Escallón
1
Ça y est. la façon la plus simple de le faire lol
benji8
12

MISE À JOUR POUR VS CODE 1.40.0

Après avoir fait:

$ pip install pylint-django

Suivez ce lien: https://code.visualstudio.com/docs/python/linting#_default-pylint-rules

Notez que la manière de prendre pylinten compte pylint-djangoest de spécifier:

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

dans le settings.jsoncode VS.

Mais après cela, vous remarquerez de nombreuses nouvelles erreurs de peluchage. Ensuite, lisez ce qu'il a dit ici:

Ces arguments sont transmis chaque fois que la valeur python.linting.pylintUseMinimalCheckersest true(valeur par défaut). Si vous spécifiez une valeur dans pylintArgsou utilisez un fichier de configuration Pylint (voir la section suivante), alors pylintUseMinimalCheckersest implicitement défini sur false .

Ce que j'ai fait, c'est créer un .pylintrcfichier comme décrit dans le lien, puis configurer les paramètres suivants à l'intérieur du fichier (en laissant le reste du fichier intact):

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

Fonctionne maintenant pylintcomme prévu.

amedina
la source
Au lieu de créer un fichier .pylintrc séparé, vous pouvez obtenir le même effet en faisant cela dans votre settings.json: {"python.linting.pylintArgs": ["--load-plugins = pylint_django", "--disable = all "," --enable = F, E, inaccessible, clé en double, point-virgule inutile, variable globale non affectée, variable inutilisée, exception d'opération binaire, chaîne de format incorrect, barre oblique inverse anormale -string, bad-open-mode "]}
sql_knievel
11

Vous pouvez modifier l'extension linter pour Python pour Visual Studio Code.

Dans VS, ouvrez la palette de commandes Ctrl + Maj + P et saisissez l'une des commandes suivantes:

Python: sélectionnez Linter

lorsque vous sélectionnez un linter, il sera installé. J'ai essayé flake8 et il semble que le problème soit résolu pour moi.

papillon de nuit
la source
1
Bien que cela ait fonctionné, j'ai trouvé flake8 vraiment ennuyeux comme linter.
Richard Dunn
4

En ajoutant simplement à ce que @ Mallory-Erik a dit: vous pouvez le placer objects = models.Manager()dans les modaux:

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()
LeRoy
la source
3

Installez d'abord pylint-django en utilisant la commande suivante

$ pip install pylint-django

Exécutez ensuite la deuxième commande comme suit:

$ pylint test_file.py --load-plugins pylint_django

--load-plugins pylint_django est nécessaire pour revoir correctement un code de django

Chirag Kalal
la source
2

Si vous utilisez python 3

python3 -m pip install pylint-django

Si python <3

python -m pip install pylint-django==0.11.1

REMARQUE: la version 2.0 nécessite pylint> = 2.0 qui ne prend plus en charge Python 2! ( https://pypi.org/project/pylint-django/ )

Ashen One
la source
1

En faisant Question = new Question()(je suppose que newc'est une faute de frappe), vous écrasez le modèle Question avec une intance de Question. Comme Sayse l'a dit dans les commentaires: n'utilisez pas le même nom pour votre variable que le nom du modèle. Alors changez-le en quelque chose comme my_question = Question().

vaudou-burger
la source
c'est quelque chose avec ma configuration pc de django et pytho, je l'ai recodé sur mon macbook et cela fonctionne très bien. J'ai également essayé votre suggestion dans mon code et cela n'a fait aucune différence.
buuencrypted le
1

Que diriez-vous de supprimer les erreurs sur chaque ligne spécifique à chaque erreur?

Quelque chose comme ça: https://pylint.readthedocs.io/en/latest/user_guide/message-control.html

Erreur: [pylint] La classe 'nom_classe' n'a pas de membre 'nom_membre' Elle peut être supprimée sur cette ligne par:

  # pylint: disable=no-member
Pritam Manerao
la source
2
Aussi brutale que soit cette solution, c'est le seul moyen de préserver sa santé mentale. J'obtiens ces erreurs sur des dizaines de modules différents, je ne vais pas modifier les paramètres à chaque fois que j'en vois un nouveau.
Przemek D
1

Changez votre linter en - flake8 et le problème disparaîtra.

Venu Gopal Tewari
la source
0

Ce problème survient lorsque j'utilise pylint_runner

Donc, ce que je fais est d'ouvrir le fichier .pylintrc et d'ajouter ceci

# 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
Tony Ngo
la source
0

J'ai pu mettre à jour les paramètres utilisateur.json

Sur mon mac, il était stocké dans:

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

À l'intérieur, j'ai défini ce qui suit:

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

Cela a résolu le problème pour moi.

Kingsley Ijomah
la source