电子商务应用程序中的Django用户模型扩展

时间:2017-10-28 20:07:31

标签: python django

我有一个django电子商务项目工作正常,直到我决定改进它。我让用户在某些服务上下订单,但每次下订单时都要输入他们的详细信息(姓名,邮件,地址等),所以我决定升级应用程序,以便用户可以添加他们的帐单地址,并且可以参考在订单中或继续作为客人。

模型

class Order(models.Model):
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50)
    email = models.EmailField()
    address = models.CharField(max_length=250) 
    postal_code = models.CharField(max_length=20) 
    city = models.CharField(max_length=100)
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 
    paid = models.BooleanField(default=False)

class OrderItem(models.Model):
    order = models.ForeignKey(Order, related_name='items')
    product = models.ForeignKey(Product,related_name='order_items')
    price = models.DecimalField(max_digits=10, decimal_places=2)
    quantity = models.PositiveIntegerField(default=1)

查看

def order_create(request):
    cart = Cart(request)
    if request.method == 'POST':
        form = OrderCreateForm(request.POST) 
        if form.is_valid():
            order = form.save() 
            for item in cart:
            OrderItem.objects.create(order=order, product=item['product'],price=item['price'], quantity=item['quantity'])
            cart.clear()
            return render(request,'order/created.html', {'order': order})
    else:
        form = OrderCreateForm()
    return render(request, 'order/create.html',{'cart': cart, 'form': form})

然后我创建了一个帐户应用程序和扩展的django用户,以便用户可以注册地址和移动设备,这样用户每次都不需要输入订单就可以输入。

我的新模型

class Order(models.Model):
    account = models.ForeignKey(Account, related_name='user_account')
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    paid = models.BooleanField(default=False)
    coupon = models.ForeignKey(Coupon, related_name='orders',null=True,blank=True)
    discount = models.IntegerField(default=0,validators=[MinValueValidator(0), MaxValueValidator(100)])

我对如何编写视图感到困惑。任何帮助都会有所帮助,我也有帮助

def admin_order_detail(request, order_id):
    order = get_object_or_404(Order, id=order_id)
    #account = Account.objects.filter(request.user)
    context = {
        'order': order,
        }
    template = 'order/detail.html'
    return render(request,template,context)

能够查看管理区域中的订单详细信息,但我只能扩展FUll名称,电子邮件和电话号码。任何帮助,将不胜感激。提前致谢

来自github的所有代码的副本 https://github.com/Olar19/ecommerce

4 个答案:

答案 0 :(得分:1)

你想要做的事情是非常普遍和合理的事情。有两种主要方法可以向Django User模型添加其他信息。 1)您可以覆盖django用户模型并定义自己的自定义模型或2)您可以创建另一个模型,比如UserData,并让UserData与Django的用户模型建立OneToOneField连接。因此,对于每个用户,都有一个关联的UserData,用于存储您需要的其他字段信息。很难并且不建议在现有项目的中间执行选项1,因此我建议转换到选项2.

django文档非常适合如何创建UserData模型并将其链接到User模型。你可以阅读它here。关于这种方法的一个关键注意事项是,您需要a)返回并为所有现有用户(如果存在)创建UserData对象,并且b)每次用户注册用户帐户时都需要确保创建UserData对象你的网页。

class UserData(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, default=0, related_name="userdata")
    # other fields ...

现在,在您的视图中,您可以访问用户数据:

def admin_order_detail(request):
    ud = request.user.userdata

当您想要在视图中访问用户数据时,它是

我只是查看了你的代码,看起来你目前没有使用Django的用户系统让用户注册和登录。我认为第一步是阅读用户身份验证系统(here)上的django文档。然后,尝试将用户身份验证集成到您的应用程序中。最后,您可以创建自定义userdata类来扩展用户模型。

祝你好运!

答案 1 :(得分:0)

利用内置的User对象是一个好主意。 Django非常“包含电池”,这意味着它与Flask相比具有更多的开箱即用功能,而且对我来说是User auth系统的很大一部分。

通常,您将使用一对一字段扩展User对象,该字段在您的上下文中看起来像Account对象。

more detail on one-to-one fields (from the docs)

如果您是B2B副B2C,那么您可能希望Account对象存放公司名称,然后将员工分配到该帐户,其中Employee对象将成为User的扩展名。

假设Account对象看起来像:

class Account(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(max_length=500, blank=True)
    ...

然后,您可以从订单对象访问帐户和用户对象。

order = get_object_or_404(Order, id=order_id)
username = order.user_account.username

或权限类型的东西

orders = Order.objects.filter(user_account__user = request.user)

答案 2 :(得分:0)

你可以使用

order.account.user

如果您想从订单加入用户必须使用帐户(字段名称不相关名称)

如果您想从帐户实例加入订单,可以使用:

account.user_account.all()

相关名称是反向访问名称。从相关对象访问

因此,最好将帐户字段的相关名称命名为订单

答案 3 :(得分:0)

我认为您应该创建一个将AbstractUser扩展为电子邮件地址作为OneToMany字段的帐户模型,以允许一个用户拥有多个地址。地址可以是包含

等字段的模型
  

姓名,地址第1行,地址第2行,邮政编码,城市,州,   用户(FK)

或包含all-info和user-fk的单个文本字段。

当用户选择其中一个地址时,您只需为该对应订单添加订单模型的地址条目,这样客户就可以从一个或多个已提供的地址中进行选择。

class Order(models.Model):
    account = models.ForeignKey(Account, related_name='user_account')
    address = models.ForeignKey(Address, related_name='address')
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    paid = models.BooleanField(default=False)
    coupon = models.ForeignKey(Coupon, related_name='orders',null=True,blank=True)
    discount = models.IntegerField(default=0,validators=[MinValueValidator(0), MaxValueValidator(100)])

这也使我们能够通过order.account和order.address检索给定订单的帐户详细信息和地址。