Javascript Django数据库关系模型中的多选字段
这是我在Stackoverflow上的第一篇帖子,所以请忽略错误。在发布之前,我尝试了十几种解决方案,但都没有奏效。我在模型中为用户提供了表关系。我需要创建一个模型表单,让客户从前端为任何项目选择多个用户。我很难用代码实现它。另外,对于另一个字段,我需要将选择限制为一个用户。下面是代码 型号:Javascript Django数据库关系模型中的多选字段,javascript,python,django,Javascript,Python,Django,这是我在Stackoverflow上的第一篇帖子,所以请忽略错误。在发布之前,我尝试了十几种解决方案,但都没有奏效。我在模型中为用户提供了表关系。我需要创建一个模型表单,让客户从前端为任何项目选择多个用户。我很难用代码实现它。另外,对于另一个字段,我需要将选择限制为一个用户。下面是代码 型号: class Project(models.Model): project_name = models.CharField(max_length=100) assigned_to = model
class Project(models.Model):
project_name = models.CharField(max_length=100)
assigned_to = models.ManyToManyField(User)
project_url = models.URLField()
def __init__(self):
return str(self.project_name)
形式
视图:
def projects(request):
template = 'projects/projects.html'
if request.method == 'POST':
form = ProjectForm(request.POST)
if form.is_valid():
form.save()
else:
form = ProjectForm()
return render(request, template, {'form': form})
HTML:
{%csrf_令牌%}
{{form}}
提交
非常感谢您的帮助 forms.py:
from django import forms
from .models import Project
class ProjectForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
assigned_users = kwargs.pop('assigned_to', [])
super(ProjectForm, self).__init__(*args, **kwargs)
for field in self.fields.values():
field.widget.attrs = {"class": "form-control"}
self.fields['project_name'].required = True
self.fields['project_url'].required = True
if assigned_users:
self.fields['assigned_to'].queryset = assigned_users
self.fields['assigned_to'].required = True
self.fields['project_name'].widget.attrs.update({
'placeholder': 'Project Name'})
self.fields['project_url'].widget.attrs.update({
'placeholder': 'Project URL'})
class Meta:
model = Project
fields = ('project_name', 'project_url', 'assigned_to')
views.py
def create_project(request):
template_name = "create.html"
users = []
form = ProjectForm(assigned_to=users)
if request.method == 'POST':
form = ProjectForm(request.POST, request.FILES, assigned_to=users)
if form.is_valid():
proj_obj = form.save(commit=False)
proj_obj.created_by = request.user
proj_obj.save()
if request.POST.getlist('assigned_to', []):
proj_obj.assigned_to.add(*request.POST.getlist('assigned_to'))
assigned_to_list = request.POST.getlist('assigned_to')
success_url = reverse('projects:list')
if request.POST.get("savenewform"):
success_url = reverse("leads:add_lead")
return JsonResponse({'error': False, 'success_url': success_url})
return JsonResponse({'error': True, 'errors': form.errors})
context = {}
context["proj_form"] = form
context["users"] = users
context["assignedto_list"] = [
int(i) for i in request.POST.getlist('assigned_to', []) if i]
return render(request, template_name, context)
create.html:
<div class="form-control">
{{ proj_form.project_name }}
{{ proj_form.assigned_to }}
{{ proj_form.project_url }}
</div>
{{proj_form.project_name}
{{proj_form.assigned_to}}
{{proj_form.project_url}
在这种情况下,我有一个带有复选框的用户列表。在提交时,我有一个post请求发送用户列表,在views.py中,我将从request.post获取列表,同时覆盖post方法,然后在该列表中循环并添加用户pk。。类似于“``的内容用于选定项目中的pk:try:user=user.objects.get(pk=pk)project.project\u users.add(user)除了User.DoesNotExist:continue``不知道这是否是您想要的解决方案,但我有一个确切的目标来实现它,就像在添加问题时在StackOverFlow选择“标记”。但对于初学者来说,这个列表已经足够了,我会在以后自己添加自动完成。哇,老兄,牛眼。非常感谢你的帮助。我编辑了自己的代码,这是我正在做的。忽略JSON部分,因为我很忙。
def create_project(request):
template_name = "create.html"
users = []
form = ProjectForm(assigned_to=users)
if request.method == 'POST':
form = ProjectForm(request.POST, request.FILES, assigned_to=users)
if form.is_valid():
proj_obj = form.save(commit=False)
proj_obj.created_by = request.user
proj_obj.save()
if request.POST.getlist('assigned_to', []):
proj_obj.assigned_to.add(*request.POST.getlist('assigned_to'))
assigned_to_list = request.POST.getlist('assigned_to')
success_url = reverse('projects:list')
if request.POST.get("savenewform"):
success_url = reverse("leads:add_lead")
return JsonResponse({'error': False, 'success_url': success_url})
return JsonResponse({'error': True, 'errors': form.errors})
context = {}
context["proj_form"] = form
context["users"] = users
context["assignedto_list"] = [
int(i) for i in request.POST.getlist('assigned_to', []) if i]
return render(request, template_name, context)
<div class="form-control">
{{ proj_form.project_name }}
{{ proj_form.assigned_to }}
{{ proj_form.project_url }}
</div>