【发布时间】:2019-12-09 05:21:27
【问题描述】:
我是 django 的新手,我在链式下拉列表的开发过程中有所收获。我尝试了几种方法,但对我没有用。初始下拉字段可能是资产类型,在选择下一个字段后,即。类别应根据资产类型填充,反之亦然,子类别和模型名称也一样。任何人都可以帮我解决这个问题。下面我分享我的代码供您参考。
models.py 代码是
from django.db import models
from django.utils import timezone
# Create your models here.
class asset_type(models.Model):
asset_type = models.CharField(max_length=252,unique=True)
def __str__(self):
return self.asset_type
class category(models.Model):
asset_type = models.ForeignKey('asset_type', on_delete=models.CASCADE)
category = models.CharField(max_length=252,unique=True)
def __str__(self):
return self.category
class subcategory(models.Model):
asset_type = models.ForeignKey('asset_type', on_delete=models.CASCADE)
category = models.ForeignKey('category',on_delete=models.CASCADE)
subcategory = models.CharField(max_length=50,unique=True)
def __str__(self):
return self.subcategory
class model_details(models.Model):
asset_type = models.ForeignKey('asset_type', on_delete=models.CASCADE)
category = models.ForeignKey('category',on_delete=models.CASCADE)
subcategory = models.ForeignKey("subcategory", on_delete=models.CASCADE)
model_name = models.CharField(max_length=50)
def __str__(self):
return self.model_name
class stock_in(models.Model):
id = models.AutoField(primary_key=True)
#asset_id = models.ForeignKey(asset_master, on_delete=models.CASCADE)
asset_type = models.CharField(max_length=252)
category = models.CharField(max_length=252,null=True)
subcategory = models.CharField(max_length=252)
manufacturer = models.CharField(max_length=254)
model_name = models.CharField(max_length=50)
serial_no = models.CharField(max_length=254)
invoice_date = models.DateField(default=timezone.now())
warranty_date= models.DateField(default=timezone.now())
vendor_name = models.CharField(max_length=254)
price = models.IntegerField()
created_on = models.DateTimeField(default=timezone.now())
status=models.CharField(max_length=254,default='CURRENT')
#author = models.CharField(max_length=254,blank=True)
def __str__(self):
return self.subcategory
forms.py 代码是
class stock_inward(forms.ModelForm):
asset_type = forms.ModelChoiceField(queryset=models.asset_type.objects.none(),empty_label="----SELECT----", widget=forms.Select())
category = forms.ModelChoiceField(queryset=models.category.objects.none(),empty_label="----SELECT----", widget=forms.Select())
subcategory = forms.ModelChoiceField(queryset=models.subcategory.objects.none(),empty_label="----SELECT----", widget=forms.Select())
model_name = forms.ModelChoiceField(queryset=models.model_details.objects.none(),empty_label="----SELECT----", widget=forms.Select())
#category = forms.ModelChoiceField(queryset=models.category.objects.none(), required=False,empty_label="----SELECT----", widget=forms.Select())
#print(category)
#subcategory = forms.ModelChoiceField(queryset=models.subcategory.objects.none(), required=False,empty_label="----SELECT----", widget=forms.Select())
#model_name = forms.ModelChoiceField(queryset=models.model_details.objects.none(), required=False,empty_label="----SELECT----", widget=forms.Select())
price = forms.FloatField()
#subcategory = forms.ModelChoiceField(queryset=models.asset_master.objects.order_by().filter(category='SYSTEM').values_list('subcategory', flat=True).distinct(),empty_label='----SELECT----')
class Meta:
model = stock_in
fields = ('asset_type','category','subcategory','model_name','manufacturer','serial_no','invoice_date','warranty_date','vendor_name','price')
widgets = {
#'asset_type':forms.ModelChoiceField(queryset=models.asset_type.objects.all()),
#'category': forms.TextInput(attrs={'class':'form_control','id':'id_category'}),
#'subcategory': forms.TextInput(attrs={'class':'form_control','id':'id_subcategory'}),
'manufacturer': forms.TextInput(attrs={'class':'form_control','id':'id_manufacturer','placeholder':'Made by..'}),
#'model_name': forms.TextInput(attrs={'class':'form_control','id':'id_model_name','placeholder':'Ex:SANIAN7'}),
'serial_no': forms.TextInput(attrs={'class':'form_control','id':'id_serial_no','placeholder':'Enter Serial No..'}),
'warranty_date': forms.DateInput(attrs={'class':'form_control date','id':'id_warranty_date'}),
'vendor_name': forms.TextInput(attrs={'class':'form_control','id':'vendor_name','placeholder':'Brought From..'}),
'price': forms.NumberInput(attrs={'class':'form_control','id':'price','placeholder':'Each Price(Incl. GST)'})
}
def __init__(self,*args, **kwargs):
super(stock_inward,self).__init__(*args, **kwargs)
self.fields['asset_type'].choices = list(models.asset_type.objects.values_list('asset_type'))
views.py 代码是
from django.shortcuts import render,redirect
from stock.forms import stock_inward
from django.http import HttpResponseRedirect,JsonResponse
from django.views.generic import ListView,CreateView,UpdateView
from django.urls import reverse_lazy
from stock import models
# Create your views here.
class StockIn_Form_View(CreateView):
def get(self,request, *args, **kwargs):
context = {'form': stock_inward()}
return render(request, 'stock/stock_in.html', context)
def post(self,request, *args, **kwargs):
form = stock_inward()
if request.method=='POST':
print('POST ACCEPTED')
form = stock_inward(request.POST)
if form.is_valid():
category = form.cleaned_data.get('asset_type')
subcategory = form.cleaned_data.get('category')
model_name = form.cleaned_data.get('model_name')
# print('value is '+str(category))
# print('validated')
form.save()
# f.save()
result = 'Success'
# #context = result
# #success_url = reverse_lazy('/stock_in/')
return redirect('/stock_in/',result=result)
else:
result = 'Invalid Input'
return HttpResponseRedirect('/stock_in/',{'result':result})
return render(request,'stock/stock_in.html',{'form':form})
def stock_out(request):
return render(request,'stock/stock_out.html')
def transfer(request):
return render(request,'stock/transfer.html')
def index(request):
return render(request,'stock/index.html')
def load_categories(request):
asset_id = request.GET.get('asset_type')
categories = models.categories.objects.filter(asset_type=asset_id).order_by('asset_type')
return render(request, 'dropdown_list/category_options.html', {'categories': categories})
'''
**models.py code is **
```
from django.db import models
from django.utils import timezone
# Create your models here.
class asset_type(models.Model):
asset_type = models.CharField(max_length=252,unique=True)
def __str__(self):
return self.asset_type
class category(models.Model):
asset_type = models.ForeignKey('asset_type', on_delete=models.CASCADE)
category = models.CharField(max_length=252,unique=True)
def __str__(self):
return self.category
class subcategory(models.Model):
asset_type = models.ForeignKey('asset_type', on_delete=models.CASCADE)
category = models.ForeignKey('category',on_delete=models.CASCADE)
subcategory = models.CharField(max_length=50,unique=True)
def __str__(self):
return self.subcategory
class model_details(models.Model):
asset_type = models.ForeignKey('asset_type', on_delete=models.CASCADE)
category = models.ForeignKey('category',on_delete=models.CASCADE)
subcategory = models.ForeignKey("subcategory", on_delete=models.CASCADE)
model_name = models.CharField(max_length=50)
def __str__(self):
return self.model_name
class stock_in(models.Model):
id = models.AutoField(primary_key=True)
#asset_id = models.ForeignKey(asset_master, on_delete=models.CASCADE)
asset_type = models.CharField(max_length=252)
category = models.CharField(max_length=252,null=True)
subcategory = models.CharField(max_length=252)
manufacturer = models.CharField(max_length=254)
model_name = models.CharField(max_length=50)
serial_no = models.CharField(max_length=254)
invoice_date = models.DateField(default=timezone.now())
warranty_date= models.DateField(default=timezone.now())
vendor_name = models.CharField(max_length=254)
price = models.IntegerField()
created_on = models.DateTimeField(default=timezone.now())
status=models.CharField(max_length=254,default='CURRENT')
#author = models.CharField(max_length=254,blank=True)
def __str__(self):
return self.subcategory
'''
**Let me know if you need more information**
【问题讨论】:
标签: python django forms django-models