我正在尝试解决以下问题:
我有一个网页,只能看到主持人。此页面上显示的字段(在用户注册后): 用户名,名字+姓氏,电子邮件,状态,相关性等。
我需要使用此字段显示具有存储在db中的所有用户信息的表,但是其中两个字段可以选择,因此我想选择让主持人可以选择另一个选项,并且在单击“更新”按钮后,该字段将被更新为选择的用户。
我可以显示“状态”和“相关性”字段的所有选择,并且在从下拉列表中选择新选项后,数据库将更新。 我想显示下拉菜单,应该选择存储在数据库中的选项。我尝试了很多选择,我花了很多时间在Google上搜索,还在StackOverFlow中搜索答案或正确的方向,但没有找到任何东西。
对不起,我的英语不好,谢谢你的帮助!
models.py :
class Profile(models.Model): user = models.OneToOneField(User) status = models.IntegerField(choices=((1, _("Not relevant")), (2, _("Review")), (3, _("Maybe relevant")), (4, _("Relevant")), (5, _("Leading candidate"))), default=1) relevance = models.IntegerField(choices=((1, _("Unread")), (2, _("Read"))), default=1)
Forms.py :
class CViewerForm(forms.Form): status = forms.ChoiceField(label="", initial='', widget=forms.Select(), required=True) relevance = forms.ChoiceField(widget=forms.Select(), required=True)
views.py :
@group_required('Managers') @render_to('reader/view.html') def admins_view(request): users_list = Profile.objects.select_related('user').all() users_dict = dict() if request.method and request.method == 'POST': form = CViewerForm(request.POST) if form.is_valid(): d = form.cleaned_data # get all selected choices status_list = request.POST.getlist('status') relevance_list = request.POST.getlist('relevance') # get all usernames viewed on page users_list = request.POST.getlist('username') # create dict from all those lists users_dict = zip([user for user in users_list], [status for status in status_list], [rel for rel in relevance_list]) # run through dict and do bulk update for user_dict in users_dict: Profile.objects.filter(user__username=user_dict[0]).update(status=user_dict[1], relevance=user_dict[2]) return HttpResponseRedirect(reverse('reader:admins_view')) else: form = CViewerForm() return {'users_list': users_list, 'user': request.user, 'form': form}
模板:
<form class="form-horizontal" action="" method="post" name="update-form" class="well form-inline" id="view_form"> {% csrf_token %} {{ form.non_field_errors }} {% for hidden in form.hidden_fields %} {{ hidden }} {% endfor %} {% if user.is_staff %} <div> <table class="table table-striped table-condensed"> <thead> <tr> <th>{% trans 'Username' %} </th> <th>{% trans 'E-mail' %} </th> <th>{% trans 'Status' %} </th> <th>{% trans 'Relevance' %} </th> </tr> </thead> <tbody> {% for user in users_list %} <tr> <td><input type="text" READONLY name="username" value="{{ user.user.username }}"></td> <td>{{ user.user.first_name }}</td> <td>{{ user.user.last_name }}</td> <td>{{ user.user.email }}</td> <td>{{ user.get_status_display }}</td> <td>{{ user.get_relevance_display }}</td> </tr> {% endfor %} </tbody> </table> </div> {% endif %} <br> {% endif %} <div class="form-actions"> <input type="hidden" name="_cmd_personal"> <input type="submit" class="btn btn-info" value="{% trans 'Update' %}" name="update" class="default"> </div> </form>
下面是一个解决方案:
forms.py(如@Liarez所写)。
<form class="form-horizontal" action="" method="post" name="update-form" class="well form-inline" id="view_form"> {% csrf_token %} {% if user.is_staff %} {% if users_list %} <div> <table class="table table-striped table-condensed"> <thead> <tr> <th>{% trans 'Username' %} </th> <th>{% trans 'First name' %} </th> <th>{% trans 'Last name' %} </th> <th>{% trans 'E-mail' %} </th> <th>{% trans 'CV Status' %} </th> <th>{% trans 'CV Relevance' %} </th> </tr> </thead> <tbody> {% for user in users_list %} <tr> <td><input type="text" READONLY name="username" value="{{ user.user.username }}"></td> <td>{{ user.user.first_name }}</td> <td>{{ user.user.last_name }}</td> <td>{{ user.user.email }}</td> <td> <select name="cv_status"> {% for key, status in status_choices %} {% ifequal user.get_cv_status_display status %} <option value="{{ user.cv_status }}" selected>{{ user.get_cv_status_display }}</option> {% else %} <option value="{{ key }}">{{ status }}</option> {% endifequal %} {% endfor %} </select> </td> <td> <select name="cv_signal"> {% for key, signal in signal_choices %} {% ifequal user.get_cv_signal_display signal %} <option value="{{ user.cv_signal }}" selected>{{ user.get_cv_signal_display }}</option> {% else %} <option value="{{ key }}">{{ signal }}</option> {% endifequal %} {% endfor %} </select> </td> </tr> {% endfor %} </tbody> </table> </div> {% endif %} <br> {% endif %} <div class="form-actions"> <input type="submit" class="btn btn-info" value="{% trans 'Update' %}" name="update" class="default"> </div>
首先,我建议您,因为@ ChrisHuang-Leaver建议您在此处定义一个具有所需所有选择的新文件,例如choices.py:
choices.py
STATUS_CHOICES = ( (1, _("Not relevant")), (2, _("Review")), (3, _("Maybe relevant")), (4, _("Relevant")), (5, _("Leading candidate")) ) RELEVANCE_CHOICES = ( (1, _("Unread")), (2, _("Read")) )
现在您需要将它们导入模型中,因此代码很容易理解,就像这样( models.py ):
from myApp.choices import * class Profile(models.Model): user = models.OneToOneField(User) status = models.IntegerField(choices=STATUS_CHOICES, default=1) relevance = models.IntegerField(choices=RELEVANCE_CHOICES, default=1)
你 必须导入选择 在 forms.py太 :
forms.py:
from myApp.choices import * class CViewerForm(forms.Form): status = forms.ChoiceField(choices = STATUS_CHOICES, label="", initial='', widget=forms.Select(), required=True) relevance = forms.ChoiceField(choices = RELEVANCE_CHOICES, required=True)
无论如何,您的模板都有问题,因为您没有使用any {{form.field}},因此生成了一个表,但是仅隐藏字段没有输入。
{{form.field}}
当用户为职员时,应生成尽可能多的输入字段,只要您可以管理。我认为django形式并不是您所处情况的最佳解决方案。
我认为使用html表单会更好,因此可以使用boucle生成尽可能多的输入:{% for user in users_list %}并且生成具有与用户相关的ID的输入,并且可以在视图中管理所有这些输入。
{% for user in users_list %}