Создание списка CustomUserModel - PullRequest
1 голос
/ 28 мая 2020

Я хочу создать список в шаблоне моей CustomUserModel, который имеет поле OnetoOne с моделью под названием customer, как показано ниже

class UserManager(BaseUserManager):
    def create_user(self, email, password=None,is_active=True, is_staff=False, is_admin=False):
        if not email:
            raise ValueError("Users must have email address")
        user_obj = self.model(email = self.normalize_email(email))
        if not password:
            raise ValueError("Users must have a password")

        user_obj.set_password(password)
        user_obj.staff = is_staff
        user_obj.admin = is_admin
        user_obj.active = is_active
        user_obj.save(using=self._db)

        return user_obj

    def create_staffuser(self,email,password=None):
        user = self.create_user(email, password=password,is_staff=True)

        return user

    def create_superuser(self, email, password=None):
        user = self.create_user(email, password=password, is_staff=True, is_admin=True)

        return user



class User(AbstractBaseUser):

    email = models.EmailField(max_length=255,unique=True)
    active = models.BooleanField(default=True)
    staff = models.BooleanField(default=False)
    admin = models.BooleanField(default=False)


    USERNAME_FIELD = 'email'
    # email and password are required by default
    REQUIRED_FIELDS = []

    objects = UserManager()

    def __str__(self):
        return self.email

    def get_full_name(self):
        return self.email

    def get_short_name(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    @property
    def is_staff(self):
        return self.staff

    @property
    def is_admin(self):
        return self.admin

    @property
    def is_active(self):
        return self.active


class Customer(models.Model):

    GENDER = (
            ('Male', 'Male'),
            ('Female', 'Female'),
            )

    TITLE = (
            ('Mr', 'Mr'),
            ('Mrs', 'Mrs'),
            ('Miss', 'Miss'),
            ('Ms', 'Ms'),
            ('Dr', 'Dr'),
            ('Sir', 'Sir'),
            ('Madam', 'Madam'),
            )



    user = models.OneToOneField(User,on_delete=models.CASCADE)
    title = models.CharField(max_length=200, null=True, choices=TITLE)
    first_name = models.CharField(max_length=200, null=True)
    middle_name = models.CharField(max_length=200, blank=True,default='')
    last_name = models.CharField(max_length=200, null=True)
    phone = models.CharField(max_length=200, null=True)
    country = CountryField()
    birth_year = models.CharField(max_length=4, null=True)
    gender = models.CharField(max_length=200, null=True, choices=GENDER)
    date_created = models.DateTimeField(auto_now=True, null=True)
    profile_pic = models.ImageField(null=True, blank=True)
    last_purchase = models.DateTimeField(blank=True, null=True)

    def __str__(self):
        return self.first_name

class Tag(models.Model):
    name = models.CharField(max_length=200, null=True)

    def __str__(self):
        return self.name

См. Ниже мои фильтры .py

class CustomerlistFilter(django_filters.FilterSet):

    q = django_filters.CharFilter(method="my_custom_filter")


    class Meta:
        model = Customer
        fields = ['q']

    def my_custom_filter(self,queryset,name,value):
        return Customer.objects.filter(
        Q(id__icontains=value)
        |Q(first_name__icontains=value)
        |Q(middle_name__icontains=value)
        |Q(last_name__icontains=value)
         )


и мои взгляды, показанные ниже

def customer_list(request):




    customer_list = Customer.objects.all().order_by('id')
    order = Order.objects.all()
    k = Order.objects.values('customer_id').annotate(last_created=Max('date_created'))
    myFilter1 = CustomerlistFilter(request.GET,queryset=customer_list)
    customer_list = myFilter1.qs
    context = {'customer_list':customer_list, 'myFilter1': myFilter1,'order':order, 'k':k, 'user':user}


    return render(request, 'accounts/customer_list.html', context)

См. Шаблон ниже


        <br>

        <div class="row">
            <div class="col-md">
                <div class="card card-body">
                    <h5>Customer List</h5>
                </div>


<div class="coolo">
    <div class="form-group col-md-5 mb-10" >
        <form method="get">
            {% csrf_token %}
            {{myFilter1.form | crispy}}

            <a class="btn btn-primary" name = 'new_customer' href="{% url 'new_customer_profile' %}" role="button">NEW</a>
     </div>
</div>


                <div class="card card-body">
                    <table class="table">
                        <tr>
                            <th>Customer ID</th>
                            <th>Full name</th>
                            <th>Email Address</th>
                            <th>Last Purchased</th>
                            <th></th>
                            <th></th>
                        </tr>

            {% for i in customer_list %}





                            <tr>
                                <td>01010{{i.id}} </td>
                                <td>{{i.first_name}} {{i.middle_name}} {{i.last_name}}</td>
                                <td>{{i.d}}</td>
                      <td></td>
                                <td><a class="btn btn-sm btn-info" name= "edit_customer" href="{% url 'customer_profile' i.id %}">Edit</a></td>
                                <td><a class="btn btn-sm btn-danger" href="{% url 'delete_profile' i.id %}">Delete</a></td>
                            </tr>


                            {% endfor %}






В его нынешнем виде идентификатор клиента и first_name для каждой модели клиента для отображения в списке клиентов, однако он не отображает электронную почту, поскольку это поле в пользовательской модели.

Как сделать так, чтобы отображался список полей как для моделей пользователей, так и для моделей клиентов?

1 Ответ

1 голос
/ 28 мая 2020

Вы можете просто написать

<td>{{i.user.email}}</td>
...