質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.62%

Django2の汎用クラスビューListViewを使ってデータベースから情報を表示したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 277

nre

score 10

前提・実現したいこと

Django2で定義したmodelカスタムユーザーのデータを汎用クラスビューListViewを使ってHTMLに表示させたいです。

■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

runserverすると黄色画面に
AttributeError at /
'User' object has no attribute 'file'

Error during template rendering
In template /Users/VASDAQ/PycharmProjects/20190806hozon【汎用クラスビュー】/mysite/register/templates/register/base.html, error at line 0

'User' object has no attribute 'file'

と表示されます。

<!doctype html>
2    <html lang="ja">
3    <head>
4        <!-- Required meta tags -->
5        <meta charset="utf-8">
6        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
7    
8        <!-- Bootstrap CSS -->
9        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css"
10              integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous">

該当のソースコード

**models.py**

class User(AbstractBaseUser, PermissionsMixin):
    """カスタムユーザーモデル."""

    email = models.EmailField(_('email address'), unique=True)
    first_name = models.CharField(_('名'), max_length=30, blank=True)
    last_name = models.CharField(_('姓'), max_length=150, blank=True)
    nick_name = models.CharField(_('ニックネーム'), max_length=30, blank=False)

    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_(
            'Designates whether the user can log into this admin site.'),
    )
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'
        ),
    )
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    objects = UserManager()

    EMAIL_FIELD = 'email'
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')

    def get_full_name(self):
        """Return the first_name plus the last_name, with a space in
        between."""
        full_name = '%s %s' % (self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        """Return the short name for the user."""
        return self.first_name

    def email_user(self, subject, message, from_email=None, **kwargs):
        """Send an email to this user."""
        send_mail(subject, message, from_email, [self.email], **kwargs)

    def __str__(self):
        """ファイルのURLを返す"""
        return self.file.url

    @property
    def username(self):
        """username属性のゲッター

        他アプリケーションが、username属性にアクセスした場合に備えて定義
        メールアドレスを返す
        """
        return self.email

    def save_and_rename(self, url, name=None):
        res = requests.get(url)
        if res.status_code != 200:
            return "No Image"
        path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + "/media/image/"
        if name == None:
            path += url.split("/")[-1]
        else:
            path += name
        with open(path, 'wb') as file:
            file.write(res.content)
        return path



**views.py**

from django.views.generic import ListView #←読み込めない
from register.model import User
from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.contrib.auth.views import (
    LoginView, LogoutView
)
from django.contrib.sites.shortcuts import get_current_site
from django.core.signing import BadSignature, SignatureExpired, loads, dumps
from django.http import HttpResponseBadRequest
from django.shortcuts import redirect, resolve_url
from django.template.loader import render_to_string
from django.views import generic
from .forms import (
    LoginForm, UserCreateForm, UserUpdateForm
)

class ListVie(generic.ListView):
    model = User
    template_name = 'register/top.html'


**urls.py**

urlpatterns = [
    path('', views.ListVie.as_view(), name='top'),]
{% extends "register/base.html" %}
{% block content %}

<div class="container-fluid">
    <div class="row">
        <div class="col-sm-8" style="background:blue;">
            <p>新着フリーランス一覧コンテナ</p>
            <div class="row">
                <div class="col-sm-6" style="background:pink">
                    <ul>
                        {% for item in user_list %}
                        <li>{{ item }}</li>
                        {% endfor %}
                    </ul>
                </div>
           </div>
    </div>
  </div>
</div>

試したこと

def関数などでも試したのですが全くダメです取り出せませんでした。

def product_detail(request, product_id):
    try:
        product = User.objects.get(id=user_id)
    except User.DoesNotExist:
        raise Http404
    return TemplateResponse(request, 'register/top.html',
                            {'product': product})

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • t_obara

    2019/08/08 12:27

    参考にしたソースのコピペミスなのでは?再度元のソースとよく見比べてみてはいかがでしょうか。

    キャンセル

  • nre

    2019/08/08 13:04

    ご返信ありがとうございます。
    ソースコードは元々、会員登録、ログイン、マイページ機能を実装するためのものとなっておりまして、会員登録の際に使うmodelのカスタムユーザークラスにテーブルを自身で追加した物となっております。

    キャンセル

回答 1

checkベストアンサー

0

def __str__(self):
    """ファイルのURLを返す"""
    return self.file.url

ここのfileが宣言されていないからでは?
宣言するか別のものに変えれば動きそうです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/08 14:42

    ご返信していただき誠にありがとうございます。

    ちなみにどの部分に宣言すればいいかお教え頂けませんでしょうか。
    models.pyのclass Userとview.py ListViewと、forms.pyとかにそれぞれ宣言してみたんですが同じ画面が表示されました。

    大変お手数ですがご回答の程よろしくお願い申し上げます。

    キャンセル

  • 2019/08/08 14:53

    場所としてはmodels.pyのUserクラスの中です。emailとかfirst_nameとかと同じ感じでやってください。

    聞きたいのですがUserモデルはファイルのURLを返せばいいんですか?
    これがうまく動いたとしてページに表示されるのはファイルのURLなわけですが。

    キャンセル

  • 2019/08/08 15:02

    ご返信していただき誠にありがとうございます。
    mistn様のおかげで動きました!
    大変申し訳ございません。
    知識が足らずファイルのURLという意味がわかりません。

    私はformでUserにデータを保存してそれを取り出したいと考えておりました。今回はHTMLの{{ item }}部分を{{ item.nick_name }}とする事でデータベースの欲しい情報を抜き出す事が出来ました!

    本当にありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる