2017-08-30 1 views
0

Windows上でMySQL 5.6.16で動作するdjango 1.11.4アプリケーションがあります。新しいデータを追加したり、既存のデータを更新したりすると、再起動するまで新しい情報が表示されません。私はhereのようにdb_nameを提供しようとしましたが、私の場合を解決していません。Djangoがデータベースから更新されたデータを表示していません

どのように解決できますか? 私はdjangoに付属のデフォルトWebサーバーを使用しています。

class Member(AbstractUser): 

    first_name = models.CharField(verbose_name=_('First Name'), blank=False, max_length=100) 
    last_name = models.CharField(verbose_name=_('Last Name'), blank=False, max_length=100) 
    member_number = models.IntegerField(blank=False, unique=True) 
    national_id = models.IntegerField(verbose_name=_('National ID Number'), blank=False, unique=True) 
    phone_number = models.CharField(max_length=50, verbose_name=_('Phone Number')) 
    email = models.EmailField(verbose_name=_('Email'), unique=True, max_length=100, blank=False) 
    username = models.CharField(verbose_name=_('User name'), max_length=50, blank=True, null=True) 
    position = models.CharField(verbose_name=_('Position in Society'), 
          max_length=100, 
          choices=(
           ('MEMBER', 'Member'), ('COMMITTEE', 'Committee'), ('STAFF', 'Staff'), 
          )) 
    employer = models.CharField(verbose_name=_('Employer'), max_length=250, blank=True) 

    objects = UserManager() 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['member_number', 'national_id', 'first_name', 'last_name'] 

    class Meta: 
     verbose_name = _('member') 
     verbose_name_plural = _('members') 
     db_table = 'members_member' 

    def get_short_name(self): 
     return self.last_name 

    def __str__(self): 
     return self.get_full_name() 

以下のように は私の完全なモデルが自分のデータベース接続設定は、これは部材

class CreateMember(LoginRequiredMixin, PermissionRequiredMixin, CreateView): 

    model = Member 
    form_class = MemberCreationForm 
    permission_required = ('members.add_member',) 
    permission_denied_message = "Permission denied" 

    def get(self, request, *args, **kwargs): 

     return render(request, 'members/create_member.html', {'form': self.form_class}) 

    def post(self, request, *args, **kwargs): 

     form = MemberCreationForm(data=request.POST,) 

     if form.is_valid(): 

      form.save() 

      messages.success(self.request, 'Success, member was added.', extra_tags='alert alert-success') 

      return redirect(to='/members/directory') 

     else: 

      messages.error(self.request, 'Errors occurred.', extra_tags='alert alert-danger') 

      return render(request, 'members/create_member.html', {'form': form}) 

そしてフォームを作成views.pyクラスである

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'open_db', 
     'USER': 'root', 
     'PASSWORD': 'rootpass', 
     'HOST': 'localhost', 
     'PORT': '3306', 
    } 
} 

下に表示されています上記のビューで使用されているforms.pyで使用されています

class MemberCreationForm(UserCreationForm): 
     def __init__(self, *args, **kwargs): 
      super(MemberCreationForm, self).__init__(*args, **kwargs) 

      self.fields['email'].widget.attrs['class'] = 'form-control' 
      self.fields['first_name'].widget.attrs['class'] = 'form-control' 
      self.fields['last_name'].widget.attrs['class'] = 'form-control' 
      self.fields['national_id'].widget.attrs['class'] = 'form-control' 
      self.fields['member_number'].widget.attrs['class'] = 'form-control' 
      self.fields['phone_number'].widget.attrs['class'] = 'form-control' 
      self.fields['password1'].widget.attrs['class'] = 'form-control' 
      self.fields['password2'].widget.attrs['class'] = 'form-control' 
      self.fields['email'].widget.attrs.pop("autofocus", None) 

     class Meta(UserCreationForm.Meta): 
      model = Member 
      fields = ('email', 'first_name', 'last_name', 'national_id', 'member_number', 'phone_number',) 

次に、新しいメンバーが追加された後にリダイレクトするviews.pyのListView。

class MemberDirectory(LoginRequiredMixin, ListView, FormView): 

    model = Member 
    template_name = 'members/directory.html' 
    paginate_by = 5 

    try: 
     context = { 
      'total_members': Member.objects.all().count(), 
      'active_members':  Member.objects.filter(is_active=True).count(), 
      'staff_members': Member.objects.filter(is_staff=True).count(), 
      'members_list': Member.objects.all().order_by('-date_joined') 
    } 
    except Exception: 
     context = {} 

    def get(self, request, *args, **kwargs): 
     return render(request, self.template_name, self.context) 

    def post(self, request, *args, **kwargs): 

     member_number = int(self.request.POST['member_number']) 

     if not member_number or not isinstance(member_number, int): 
      messages.error(request, 'errors occured ...', 'alert alert-danger') 
      return render(request, self.template_name, self.context) 

     self.context['members_list'] = Member.objects.filter(member_number__exact=member_number) 
     return render(request, self.template_name, self.context) 

最後に、データベースのすべてのメンバーをリストするdirectory.htmlテンプレート。

{% if members_list.count > 0 %} 
{% include 'members/filters-form.html' %} 
<table class="table table-responsive table-striped"> 
<thead> 
    <th>Name</th><th>Member number</th><th>Email</th><th>Phone</th><th>Actions</th> 
</thead> 
<tbody> 
    {% for member in members_list %} 

     <tr id="member-actions-tr"> 
      <td> 
       <a title="{% if member.is_active %}Active member{% else %}Inactive member{% endif %}" href="{% url 'members:member-details' pk=member.pk %}"> 
        <span class="glyphicon glyphicon-{% if member.is_active %}ok{% else %}alert{% endif %}" aria-hidden="true"></span> 
        &nbsp;{{ member.get_full_name }} 
       </a> 
      </td> 
      <td>{{ member.member_number }}</td> 
      <td>{{ member.email }}</td> 
      <td>{{ member.phone_number }}</td> 
      <td> 
       <div class="dropdown"> 
        <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu2" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> 
        Select <span class="caret"> </span> 
        </button> 
        <ul class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenu2" style="margin-top: 0px;"> 
        <li><a href="{% url 'payments:pay' member_id=member.pk %}">Make payment</a></li> 
        <li><a href="#" class="" data-toggle="modal" data-target="#delete-member-{{ member.pk }}"> Delete </a></li> 
        </ul> 
       </div> 
      </td> 
     </tr> 
    {% endfor %} 
</tbody> 
</table> 

{% else %} 
    <div class="panel panel-info"> No members were found. </div> 
{% endif %} 
+0

これは非常に珍しいようです。データが更新されない方法の例を挙げることができますか? [mcve] –

+0

たとえば、新しいメンバーを追加してからすべてのメンバーのリストに移動すると、新しいメンバーは表示されません。 phpmyadminで新しいメンバーを追加した場合も同じことが起こります。新しいデータは、djangoサーバーを再起動した後にのみ表示されます。 –

+0

私はmysqlからsqlite3への切り替えを試みました。それでも同じ問題があります。 –

答えて

0

本当に簡単でした。答えはドキュメントherehereです。

したがって、実際には以下のようにMemberDirectoryのlistviewを変更してください!

以前のリストビューは、データベースに変更が加えられる前にキャッシュされたデータを含むクエリセットを使用していました。

+0

そして、あなたが困っている主な理由は、それらのミックスインをすべて使用してから自分で作業をするからです。通常の['get_context_data'](https://ccbv.co.uk/projects/Django/1.11/django.views.generic.edit/FormView/#get_context_data)アプローチを使用している場合は、これには参加しません。 – Melvyn

+0

@メルビンポイント撮影、ありがとう。 –

+0

@Melvyn 'get_context_data'を' get'メソッドと 'post'メソッドと一緒に使ってMemberDirectoryクラスを書き直す方法はありますか? –

関連する問題