اذهب إلى المحتوى

السؤال

نشر

أنا أعمل في مشروع Django للادخار اليومي حيث لدي عرض كشف الحساب وأريد عرض ودائع العميل وسحوباته في جدول HTML واحد. لا أعرف ما إذا كانت هناك طريقة أخرى لعرض السجلات في جدول من نموذج بخلاف استخدام For Loop. إذا كان هناك فيرجى افادتي 
النماذج

class Deposit(models.Model): 
    customer = models.ForeignKey(Profile, on_delete=models.CASCADE, null=True)
    transID = models.CharField(max_length=12, null=True)
    acct = models.CharField(max_length=6, null=True)
    staff = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    deposit_amount = models.PositiveIntegerField(null=True) 
    date = models.DateTimeField(auto_now_add=True) 



    def get_absolute_url(self):
        return reverse('create_account', args=[self.id])

    def __str__(self):
        return f'{self.customer} Deposited {self.deposit_amount} by {self.staff.username}'

class Witdrawal(models.Model): 
    account = models.ForeignKey(Profile, on_delete=models.CASCADE, null=True)
    transID = models.CharField(max_length=12, null=True)
    staff = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    withdrawal_amount = models.PositiveIntegerField(null=True)
    date = models.DateTimeField(auto_now_add=True)


    def __str__(self):
        return f'{self.account}- Withdrawn - {self.withdrawal_amount}'

view

def account_statement(request, id):
    try:
            customer = Account.objects.get(id=id)
            #Get Customer ID
            customerID = customer.customer.id
        
    except Account.DoesNotExist:
            messages.error(request, 'Something Went Wrong')
            return redirect('create-customer')
    else:
       deposits = Deposit.objects.filter(customer__id=customerID).order_by('-date')[:5]
       #Get Customer Withdrawal by ID and order by Date minimum 5 records displayed
       withdrawals = Witdrawal.objects.filter(account__id=customerID).order_by('-date')[:5]
       context = {
            'deposits ':deposits ,
            'withdrawals ':withdrawals,
       }
       return render(request, 'dashboard/statement.html', context)

HTML

<table class="table bg-white">
                    <thead class="bg-info text-white">
                      <tr>
                        <th scope="col">#</th>
                        <th scope="col">Acct. No.</th>
                        <th scope="col">Phone</th>
                        <th scope="col">Amount</th>
                        <th scope="col">Date</th>
                        <th scope="col">Action</th>
                      </tr>
                    </thead>
                    {% if deposits %}
                    <tbody>
                    
                      
                      {% for deposit in deposits %}  
                      <tr>
                        <td>{{ forloop.counter }}</td>
                        <td>{{ deposit.acct }}</td>
                        <td>{{ deposit.customer.phone }}</td> 
                        <td>N{{ deposit.deposit_amount | intcomma }}</td>
                        <td>{{ deposit.date | naturaltime }}</td>
                        
                        <th scope="row"><a class="btn btn-success btn-sm" href="{% url 'deposit-slip' deposit.id %}">Slip</a></th>
                      </tr>
                      {% endfor %}  
                                 
                    </tbody>
                    {% else %}
                    <h3 style="text-align: center; color:red;">No Deposit Found for {{ customer.customer.profile.surname }} {{ customer.customer.profile.othernames }}</h3>
                    {% endif %}
                </table>

أنا قادر على عرض إيداع العميل فقط في الجدول أعلاه ولكن لا أعرف كيفية عرض كل من الإيداع والسحب للعميل في نفس الجدول, أرجو منكم المساعدة
شكرا لك

Recommended Posts

  • 0
نشر

يمكنك دمج نتائج استعلامات الايداع والسحب في قائمة واحدة وترتيبها حسب الوقت باستخدام ال union و order_by. ثم يمكنك استخدام القائمة الناتجة في عرض الجدول HTML.

يمكنك تعديل view الخاص بك على النحو التالي:

from django.db.models import F, Value, CharField
from django.db.models.functions import Concat

def account_statement(request, id):
    try:
        customer = Account.objects.get(id=id)
        # Get Customer ID
        customerID = customer.customer.id
    except Account.DoesNotExist:
        messages.error(request, 'Something Went Wrong')
        return redirect('create-customer')
    else:
        # Get Customer Deposit by ID and order by Date minimum 5 records displayed
        deposits = Deposit.objects.filter(customer__id=customerID).annotate(
            transaction_type=Value('deposit', output_field=CharField()),
            account=F('acct'),
            phone=F('customer__phone'),
            amount=F('deposit_amount'),
            date=F('date'),
            staff_username=F('staff__username'),
        ).order_by('-date')[:5]
        # Get Customer Withdrawal by ID and order by Date minimum 5 records displayed
        withdrawals = Witdrawal.objects.filter(account__id=customerID).annotate(
            transaction_type=Value('withdrawal', output_field=CharField()),
            account=F('account__acct'),
            phone=F('account__customer__phone'),
            amount=F('withdrawal_amount'),
            date=F('date'),
            staff_username=F('staff__username'),
        ).order_by('-date')[:5]
        # Merge Deposit and Withdrawal queries, and order by Date
        transactions = sorted(
            list(deposits) + list(withdrawals),
            key=lambda x: x.date,
            reverse=True
        )
        context = {
            'transactions': transactions,
        }
        return render(request, 'dashboard/statement.html', context)

وتعديل القالب HTML على النحو التالي:

<table class="table bg-white">
    <thead class="bg-info text-white">
        <tr>
            <th scope="col">#</th>
            <th scope="col">Acct. No.</th>
            <th scope="col">Phone</th>
            <th scope="col">Amount</th>
            <th scope="col">Date</th>
            <th scope="col">Transaction Type</th>
            <th scope="col">Staff</th>
            <th scope="col">Action</th>
        </tr>
    </thead>
    {% if transactions %}
    <tbody>
        {% for transaction in transactions %}
        <tr>
            <td>{{ forloop.counter }}</td>
            <td>{{ transaction.account }}</td>
            <td>{{ transaction.phone }}</td>
            <td>
                {% if transaction.transaction_type == 'deposit' %}
                N{{ transaction.amount|intcomma }}
                {% elif transaction.transaction_type == 'withdrawal' %}
                -N{{ transaction.amount|intcomma }}
                {% endif %}
            </td>
            <td>{{ transaction.date|naturaltime }}</td>
            <td>{{ transaction.transaction_type|title }}</td>
            <td>{{ transaction.staff_username }}</td>
            <td><a class="btn btn-success btn-sm

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...