2017-08-30 3 views
0

J'ai une application django 1.11.4 s'exécutant sur mysql 5.6.16 sous windows. Lorsque j'ajoute de nouvelles données ou que je mets à jour des données existantes, les nouvelles informations n'apparaissent qu'après le redémarrage. J'ai essayé de fournir le nom db_name comme suggéré here mais il n'a pas résolu mon cas.Django n'affiche pas les données mises à jour de la base de données

Comment puis-je résoudre ce problème? J'utilise le serveur web par défaut fourni avec django. Mon modèle complet est comme illustré ci-dessous

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

Mes paramètres de connexion de base de données sont présentées ci-dessous

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

Ceci est la classe views.py qui crée le membre

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

ensuite le formulaire utilisé dans forms.py utilisé dans la vue ci-dessus

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

Puis le ListView dans views.py que je redirige après que le nouveau membre a été ajouté.

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) 

Enfin, le modèle de directory.html qui répertorie tous les membres sur la base de données.

{% 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

Cela semble très inhabituel. Pouvez-vous donner un exemple de la façon dont les données ne sont pas mises à jour? [mcve] –

+0

Par exemple, si j'ajoute un nouveau membre, puis aller à la liste de tous les membres, le nouveau membre n'apparaît pas. La même chose se produit lorsque j'ajoute un nouveau membre via phpmyadmin. Les nouvelles données n'apparaîtront qu'après le redémarrage du serveur django. –

+0

J'ai essayé de passer de mysql à sqlite3. Le même problème toujours là. –

Répondre

0

C'était vraiment facile. La réponse est dans la documentation here et here. Par conséquent, modifier la liste de répertoires MemberDirectory comme indiqué ci-dessous a réellement fonctionné!

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(), 
     } 
    except Exception: 
     context = {} 

    def get(self, request, *args, **kwargs): 
     self.context['members_list'] = Member.objects.all().order_by('-date_joined') 
     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) 

En termes simples, la listview précédente utilisait un queryset qui contenait des données mises en cache avant que les modifications ont été apportées à la base de données.

+0

Et la principale raison pour laquelle vous avez des ennuis, c'est parce que vous utilisez tous ces mixins et que vous faites le travail vous-même. Si vous utilisez une approche normale ['get_context_data'] (https://ccbv.co.uk/projects/Django/1.11/django.views.generic.edit/FormView/#get_context_data), vous ne serez pas dans cette situation. – Melvyn

+0

@Melvyn Point pris, merci. –

+0

@Melvyn Comment réécrire la classe MemberDirectory en utilisant 'get_context_data' avec les méthodes' get' et 'post'? –