نموذج Django المخصص ImportError على الرغم من وجود الملف في نفس الدليل

StackOverflow https://stackoverflow.com//questions/20029305

سؤال

أنا أعمل من خلال جانغو فعالة سلسلة تعليمية.أواجه حاليًا مشكلة أثناء محاولة إنشاء نموذج مخصص لاستخدامه في أحد التطبيقات.لقد قمت بإنشاء ملف Forms.py وفقًا للتعليمات الواردة في هذا الجزء من البرنامج التعليمي, ، وقمت بإجراء التعديلات على ملف view.py الخاص بي.تبدو بنية الدليل الخاصة بي كما يلي:

(project root)
|
├── address.db
├── addressbook
│   ├── __init__.py
│   ├── __pycache__
│   ├── settings.py
│   ├── static
│   ├── urls.py
│   └── wsgi.py
├── contacts
│   ├── __init__.py
│   ├── admin.py
│   ├── forms.py
│   ├── models.py
│   ├── templates
│   ├── tests.py
│   └── views.py
├── manage.py
└── requirements.txt

المشكلة هي أنه عندما أحاول تحميل الموقع يظهر لي الخطأ التالي:

Traceback (most recent call last):
  File "/Users/wtodom/.virtualenvs/tutorial/lib/python3.3/site-packages/django/core/handlers/base.py", line 101, in get_response
    resolver_match = resolver.resolve(request.path_info)
  File "/Users/wtodom/.virtualenvs/tutorial/lib/python3.3/site-packages/django/core/urlresolvers.py", line 318, in resolve
    for pattern in self.url_patterns:
  File "/Users/wtodom/.virtualenvs/tutorial/lib/python3.3/site-packages/django/core/urlresolvers.py", line 346, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "/Users/wtodom/.virtualenvs/tutorial/lib/python3.3/site-packages/django/core/urlresolvers.py", line 341, in urlconf_module
    self._urlconf_module = import_module(self.urlconf_name)
  File "/Users/wtodom/.virtualenvs/tutorial/lib/python3.3/importlib/__init__.py", line 90, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1586, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1567, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1534, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 586, in _check_name_wrapper
  File "<frozen importlib._bootstrap>", line 1024, in load_module
  File "<frozen importlib._bootstrap>", line 1005, in load_module
  File "<frozen importlib._bootstrap>", line 562, in module_for_loader_wrapper
  File "<frozen importlib._bootstrap>", line 870, in _load_module
  File "<frozen importlib._bootstrap>", line 313, in _call_with_frames_removed
  File "/Users/wtodom/.virtualenvs/tutorial/addressbook/urls.py", line 4, in <module>
    import contacts.views
  File "/Users/wtodom/.virtualenvs/tutorial/contacts/views.py", line 5, in <module>
    import forms
ImportError: No module named 'forms'

السطر 5 هو السطر في view.py حيث أقوم باستيراد ملف Forms.py.مقتطف الشفرة (مع بضعة أسطر من المخزن المؤقت) هو:

from django.shortcuts import render
from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView
from django.core.urlresolvers import reverse
from contacts.models import Contact
import forms


class ListContactView(ListView):

    model = Contact
    template_name = 'contact_list.html'

كما ترون من شجرة الدليل، يجب أن يكون ملف Forms.py قابلاً للوصول.لست متأكدًا من سبب ظهور الخطأ.أيه أفكار؟

تحرير 1

حاولت تغيير الاستيراد إلى from forms import ContactForm قبل النشر أصلا.لا يزال لدي نفس الخطأ:

  File "/Users/wtodom/.virtualenvs/tutorial/contacts/views.py", line 5, in <module>
    from forms import ContactForm
ImportError: No module named 'forms'
هل كانت مفيدة؟

المحلول

بقدر ما أعرف كانت هناك تغييرات في نظام الاستيراد في Python 3.فقط كن أكثر تحديدًا بشأن ما تريد استيراده.أفترض أنك تريد الاستيراد forms.py من contacts لذا

from contacts import forms

أو يمكنك المحاولة

import .forms

نصائح أخرى

من المناسب القيام بذلك على النحو التالي:

from forms import FormClassName

أو يمكنك ذلك

from forms import *

ولكن هذا ليس ضروريا.من التطبيقات الأخرى يجب عليك

from contacts.forms import FormClassName # or wildcard '*'

عند استيراد الدليل الذي يبحث عنه بايثون، يكون الاستيراد هو جذر المشروع ولا توجد وحدة تسمى كنماذج.

لذلك، إذا كنت تريد اختبار إنشاء ملف باسم النماذج في جذر المشروع وسوف يقوم باستيراده.

بهذه الطريقة سوف تنجح بالتأكيد

from contacts.forms import FormClassName # or wildcard '*'
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top