使用一个以上的外键自动填充具有多个字段的自定义表单

时间:2020-06-12 20:45:31

标签: python django-models django-forms django-views django-templates

我已经根据下面的模型构造了一个表格

class Order(models.Model):

    STATUS = (
            ('Pending', 'Pending'),
            ('Out for delivery', 'Out for delivery'),
            ('Delivered', 'Delivered'),
            )

    customer = models.ForeignKey(Customer, null=True, on_delete = models.SET_NULL)
    product = models.ForeignKey(Product, null=True, on_delete = models.SET_NULL)
    date_created = models.DateTimeField(auto_now_add=True, null=True)
    status = models.CharField(max_length=200, null=True, choices=STATUS)
    note = models.CharField(max_length=1000, null=True)
    delivery_address1 = models.CharField(max_length=1000, null=True)
    delivery_address2 = models.CharField(max_length=1000, null=True, blank=True, default='')
    delivery_city = models.CharField(max_length=1000, null=True)
    delivery_county = models.CharField(max_length=1000, null=True)
    delivery_post_code = models.CharField(max_length=1000, null=True)
    delivery_country = CountryField()


    def __str__(self):
        return self.product.name

外键来自以下型号

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)
    address1 = models.CharField(max_length=1000,null=True)
    address2 = models.CharField(max_length=1000,null=True, blank=True, default='')
    city = models.CharField(max_length=1000, null=True)
    county = models.CharField(max_length=1000, null=True)
    post_code = models.CharField(max_length=1000, null=True)
    customer_uuid = models.UUIDField(default=uuid.uuid4)


    def __str__(self):
        return self.user.email



class Product(models.Model):


    CATEGORY = (
                ('Sports', 'Sports'),
                ('Fashion', 'Fashion'),
                ('Toys', 'Toys'),
                ('Electronics', 'Electronics'),
                ('Kitchen', 'Kitchen'),
                ('Jewellery', 'Jewellery'),
                )


    name = models.CharField(max_length=200, null=True)
    category = models.CharField(max_length=200, null=True, choices=CATEGORY)
    description = models.CharField(max_length=200, null=True, blank=True)
    r_price = models.FloatField(null=True)
    d_price =  models.FloatField(null=True, blank=True,default='')
    start_date = models.DateTimeField(null=True, blank=True,default='')
    end_date = models.DateField(null=True, blank=True,default='')
    tags = models.ManyToManyField(Tag)
    stock = models.CharField(max_length=200, null=True)
    min_stock = models.CharField(max_length=200, null=True)
    is_active = models.BooleanField(default=False)
    product_sku = models.CharField(max_length=200, null=True)


    def __str__(self):
        return self.product_sku

我希望基于product_sku字段选择我的产品外键实例,并因此自动填充(在模板中)产品模型中的现有实例字段,例如类别,名称,描述和r_price。

对于我的客户外键,也可以搜索并选择customer_uuid或名称(下拉列表)。客户字段的现有实例将是只读的,并在模板上自动填充

请参阅下面的我的表格

class CreateOrderForm(forms.ModelForm):

    class Meta:
        model = Order
        fields = '__all__'

也可以在下面查看我的views.py以创建和更新实例


@login_required
def newOrder(request):
    form = CreateOrderForm()
    if request.method == 'POST':
        form = CreateOrderForm(request.POST or None)
        if form.is_valid():
            form.save()
            return redirect('/')

    return render(request, 'accounts/new_order.html', {'form':form})


@login_required
def editOrder(request,pk):
    order = Order.objects.get(id=pk)
    form = CreateOrderForm(instance=order)

    if request.method == "POST":
        form = CreateOrderForm(request.POST,instance=order)
        if form.is_valid():
            form.save()
            return redirect('/')

    return render(request, 'accounts/edit_order.html', {'form':form})

要实现我需要做的事情需要采取的第一步?

0 个答案:

没有答案
相关问题