【问题标题】:Django 3 - Making Model's FK Dropdown Display Current User's Data OnlyDjango 3 - 使模型的 FK 下拉列表仅显示当前用户的数据
【发布时间】:2020-05-23 01:06:26
【问题描述】:

我正在使用 Django 创建我的第一个应用程序,还有很多东西要学,但现在我完全陷入困境,需要一些帮助。我有一个客户和票的模型。我有它,所以不同的用户可以保存新客户/票证,并且只有在登录后才能从仪表板查看他们的数据。但是,在创建新票证时,有一个下拉选项可以为票证选择客户 - 当前用户能够看到每一位用户的客户。

这是代码,如果需要,我会分享更多代码,但我认为这涵盖了我正在做的事情......

forms.py

class TicketForm(ModelForm):
    class Meta:
        model = Ticket
        fields = ['number', 'customer','date_created','work_description','mechanics','status']

views.py

def createTickets(request):
    form = TicketForm()
    if request.method == 'POST':
        form = TicketForm(request.POST)
        if form.is_valid():
            newticket = form.save(commit=False)
            newticket.shopowner = request.user
            newticket.save()
            return redirect('tickets')
    context = {
        'form': form
    }
    return render(request, 'createticket.html', context)

models.py

class Ticket(models.Model):
    def default_number():
        no = Ticket.objects.count()
        return no + 1
    shopowner = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
    number = models.CharField(max_length=30, unique=True, default= default_number)
    customer = models.ForeignKey(Customer, default=1, on_delete= models.SET_DEFAULT, blank=True)
    date_created = models.DateField(default=timezone.now)
    work_description = models.TextField(verbose_name="Service Details: ")
    mechanics = models.ForeignKey(Mechanic, default=1, on_delete=models.DO_NOTHING, blank=True, verbose_name="Mechanic")
    status = models.BooleanField(default=True, verbose_name="Open Ticket")
    class Meta:
        verbose_name_plural = "Tickets"

我需要 Customer 外键来仅显示当前用户(或“店主”)的客户 - 机械师和最终车辆也是如此,但一旦我知道如何获取客户输入以显示正确的数据,我就可以弄清楚这些.

【问题讨论】:

    标签: python django


    【解决方案1】:

    您需要稍微自定义表单,以便修改该特定字段的查询集。我们还需要从视图中传递一个用户:

    forms.py

    class TicketForm(ModelForm):
        class Meta:
            model = Ticket
            fields = ['number', 'customer', 'date_created', 'work_description', 'mechanics', 'status']
    
        def __init__(self, user=None, *args, **kwargs):
            super().__init__(*args, **kwargs)
            if user:
                self.fields['customer'].queryset = Customer.objects.filter(shopowner=user)
    

    views.py

    def createTickets(request):
        form = TicketForm(user=request.user)
        # ...
    

    您如何定义查询集将取决于您如何定义CustomerShopowner 之间的关系,但这应该为您提供正确的方法。

    【讨论】:

    • 我收到“TicketForm' 对象没有属性 'request'” 错误.. 会玩一段时间因为我在别处读过的内容,这似乎是要走的路。谢谢!一旦我得到它,我会将其标记为已接受的答案并分享我必须做的事情。
    • 啊抱歉 - 这样做是出于我的考虑。您需要明确地将用户传递给表单。我更新了我的答案。
    • 有效!!谢谢格雷格,你不知道我有多感激!我想我应该对刚刚发生的事情做更多的了解,这样我才能更好地理解它。但是,我很高兴它现在可以工作了!
    猜你喜欢
    • 2018-06-17
    • 2021-06-13
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 2020-02-19
    相关资源
    最近更新 更多