ChoiceField:仅在Django start

时间:2017-09-04 21:12:42

标签: django

Django 1.11.4

我的代码如下。 问题是它只执行一次:在Django开始。 我希望人们在重新加载网页时续订。 你能帮我解决这个问题吗?

forms.py

def get_people_choices():
    people = Person.objects.all()
    choices = [(None, "----")]
    choices += [(person.id, person) for person in people]
    return choices

class SearchForm(forms.Form):
    person_choice = forms.ChoiceField(label='', choices=get_people_choices(), required=False)

3 个答案:

答案 0 :(得分:1)

您应该使用模型ModelChoiceField回收代码。很简单,你的例子应该是这样的:

class SearchForm(forms.Form):
    person_choice = forms.ModelChoiceField(queryset=Person.objects.all)

它将在您的模板中返回:

<select id="id_field1" name="field1">
<option value="person1.pk">person1</option>
<option value="person2.pk">person2</option>
...
</select>

如果您想更改该值,请添加(queryset=..., to_field_name="name"),现在该值将是该人的姓名或您想要的任何内容。

如果您想查看更多check this

答案 1 :(得分:1)

最简单的解决方法是传递可调用的get_people_choices,而不是在表单定义中调用它。

class SearchForm(forms.Form):
    person_choice = forms.ChoiceField(label='', choices=get_people_choices, required=False)

这适用于Django 1.8+。对于早期版本,您必须覆盖__init__方法,如Bear Brown的答案。

正如Mauricio所建议的那样,使用ModelChoiceField可能是个更好的主意。

答案 2 :(得分:0)

您可以在字段中使用 static HttpClient client = new HttpClient(); public override void AwakeFromNib() { base.AwakeFromNib(); notif_button.Activated += (sender, e) => { }; tips_button.Activated += (sender, e) => { Tip t1 = new Tip(title_tips.StringValue, pic_tips.StringValue, content_tips.StringValue, "TEST"); client.BaseAddress = new Uri("my_url"); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); CreateProductAsync(t1).Wait(); }; } static async Task<Uri> CreateProductAsync(Tip tips) { HttpResponseMessage response = await client.PostAsJsonAsync("api/add_tips", tips); response.EnsureSuccessStatusCode(); return response.Headers.Location; }

__init__