我在一个带有几个日期字段的模型上有一个模型formset - 它也是模型中的DateTimeField.但是当它显示在模板中时,它显示为文本字段.如何将其显示为下拉框?
WFormSet = inlineformset_factory(UserProfile, W, can_delete=False,exclude=[<list of fields to be excluded>], extra=3)
Run Code Online (Sandbox Code Playgroud)
这就是我初始化modelformset的方式.
如何覆盖这些设置
我有ModelForm的问题.显示字段"test1",但"test2" - 不显示.使用base_fields没有帮助.
# models.py
class Country(models.Model):
name = CharField(max_length=100)
# admin.py
class CountryAdminForm(ModelForm):
test1 = forms.CharField('test1')
def __init__(self, *args, **kwargs):
super(CountryAdminForm, self).__init__(*args, **kwargs)
self.fields['test2'] = forms.CharField('test2')
class Meta:
model = Country
class CountryAdmin(admin.ModelAdmin):
form = CountryAdminForm
admin.site.register(Country, CountryAdmin)
Run Code Online (Sandbox Code Playgroud)
谢谢.
在保存()文档中解释说:
ModelForm的子类可以接受现有的模型实例作为关键字参数实例; 如果提供了这个,save()将更新该实例.如果未提供,save()将创建指定模型的新实例
然而,self.instance在save()总是有一个对象.
那么,我如何判断它instance是现有的还是新创建的?
我有一个模型,有一个名为'banner'的图像字段,我试图验证文件大小和尺寸,如果图像太大,则提供错误.
这是models.py:
class Server(models.Model):
id = models.AutoField("ID", primary_key=True, editable=False)
servername = models.CharField("Server Name", max_length=20)
ip = models.CharField("IP Address", max_length=50)
port = models.CharField("Port", max_length=5, default='25565')
banner = models.ImageField("Banner", upload_to='banners', max_length=100)
description = models.TextField("Description", blank=True, max_length=3000)
rank = models.IntegerField(default=0)
votes = models.IntegerField(default=0)
website = models.URLField("Website URL", max_length=200, blank=True)
user = models.ForeignKey(User)
motd = models.CharField("MOTD", max_length=150, default='n/a')
playersonline = models.CharField("Online Players", max_length=7, default='n/a')
online = models.BooleanField("Online", default=False)
sponsored = models.BooleanField("Sponsored", default=False)
lastquery = models.DateTimeField('Last Queried', auto_now=True)
slugurl = models.SlugField("SlugURL", max_length=50)
def __unicode__(self):
return …Run Code Online (Sandbox Code Playgroud) 我有一个模型组织,有两个字段'id'和'name'.我打算用动态模型formsets填充它.我到目前为止的代码如下.
形式
class OrganizationForm(forms.ModelForm):
class Meta:
model = Organization
fields = ('name',)
OrganizationFormset = modelformset_factory(Organization, form=OrganizationForm, fields=('name', ), extra=1)
Run Code Online (Sandbox Code Playgroud)
意见
class OrganizationCreate(CreateView):
model = Organization
form_class = OrganizationForm
def get_context_data(self, **kwargs):
context = super(OrganizationCreate, self).get_context_data(**kwargs)
context['formset'] = OrganizationFormset()
return context
def post(self, request, *args, **kwargs):
formset = OrganizationFormset(request.POST)
if formset.is_valid():
return self.form_valid(formset)
def form_valid(self, formset):
formset.save()
return HttpResponseRedirect('/')
def form_invalid(self, formset):
return self.render_to_response(self.get_context_data(formset=formset))
class OrganizationUpdate(UpdateView):
model = Organization
form_class = OrganizationForm
template_name_suffix = '_update_form'
def get_context_data(self, **kwargs):
context = super(OrganizationUpdate, …Run Code Online (Sandbox Code Playgroud) 我想向社区询问以下有关传递request.user给querysetin的信息ModelForm。我的ModelForm是:
class goForm(ModelForm):
user_choice = goModelChoiceField(
widget=forms.RadioSelect,
queryset=Document.objects.all().filter(who_upload=request.user),
empty_label=None,
to_field_name='docfile',
label = 'Please select'
)
class Meta:
model = go
fields = ['user_choice']
Run Code Online (Sandbox Code Playgroud)
用
class goModelChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
return "'%s' uploaded on %s" % (obj.file_name,
obj.when_upload.date())
Run Code Online (Sandbox Code Playgroud)
所有我已经找到答案指代传递request.user到__init__或填充goForm与筛选的选择的视图。但是,在我的情况下,似乎没有任何效果,因为我将表单子类化为返回特定的字符串,并且我正在使用RadioSelect特别需要使用querysetas作为参数的小部件(对此我不是100%肯定)。那么,如何可以通过request.user在user_choice?
我一直在尝试为我的ModelForm编写单元测试,它有一个ModelChoiceField.我正在使用模拟数据创建Form实例.
这是我的模特:
# models.py
class Menu(models.Model):
dish = models.ForeignKey(Dish, default=None)
price = models.DecimalField(max_digits=7, decimal_places=2)
# forms.py
class MenuForm(forms.ModelForm):
class Meta:
model = Menu
fields = ('dish', 'price',)
def clean(self):
cleaned_data = super(MenuForm, self).clean()
price = cleaned_data.get('price', None)
dish = cleaned_data.get('dish', None)
# Some validation below
if price < 70:
self.add_error('price', 'Min price threshold')
return cleaned_data
Run Code Online (Sandbox Code Playgroud)
这是我的测试用例:
class MenuFormTest(TestCase):
def test_price_threshold(self):
mock_dish = mock.Mock(spec=Dish)
form_data = {
'dish': mock_dish,
'price': 80,
}
form = forms.MenuForm(data=form_data)
self.assertTrue(form.is_valid())
Run Code Online (Sandbox Code Playgroud)
此操作失败,并显示以下错误:
<ul class="errorlist"><li>dish<ul class="errorlist"><li>Select a …Run Code Online (Sandbox Code Playgroud) 因此,我正在使用Django的Model Formset生成用于不同数据的表单集。效果很好,但是我想添加一个功能,当用户显示表单集并更新10个项目中的2个时,我只能跟踪更新的2个项目,并输出类似“您已更新2个项目”的消息“ 之类的事情。
Django Model Formsets是否为此具有内置API?我似乎在Django Docs上找不到它。
我尝试了各种方法,但是在使用下面的Peter提供的代码时仍然会遇到这种情况:
'Attendance' object has no attribute 'has_changed.'
Run Code Online (Sandbox Code Playgroud)
如果我将form.has_changed切换为formset.has_changed(),我会得到
'list' object has no attribute 'has_changed'
Run Code Online (Sandbox Code Playgroud)
我的查看和发布方法
class AttendanceView(TemplateView):
template_name = 'example.html'
def changed_forms(self, formset):
return sum(1 for form in formset if form.has_changed())
def post(self, request, *args, **kwargs):
formset = AttendanceFormSet(request.POST)
if formset.is_valid():
formset = formset.save()
forms_changed = self.changed_forms(formset)
context = self.get_context_data(**kwargs)
context['total_changed_forms'] = forms_changed
return self.render_to_response(context)
else:
return HttpResponse("POST failed")
Run Code Online (Sandbox Code Playgroud)
所以我想通了,只需更改:
formset = formset.save()
Run Code Online (Sandbox Code Playgroud)
至
formset.save()
Run Code Online (Sandbox Code Playgroud) 我试图从新创建的项目对象中提取id,以便我可以将用户重定向到包含新项目的页面.现在我得到''ProjectAddForm'对象没有属性'id'".
我在网上看到这应该有用,但出于某种原因,它不是.
if request.method == 'POST':
form = ProjectAddForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('project.views.detail', args=(form.id)))
Run Code Online (Sandbox Code Playgroud)
Forms.py
class ProjectAddForm(forms.ModelForm):
class Meta:
model = Project
Run Code Online (Sandbox Code Playgroud) 在我的 django 应用程序中,我想在页面加载时将焦点设置到第一个 CharField (任务)。
我的models.py是
from django.db import models
class ListModel(models.Model):
task = models.CharField(max_length=255)
status = models.BooleanField(default=False)
def __str__(self):
return f"{self.task} : {str(self.status)}"
Run Code Online (Sandbox Code Playgroud)
和forms.py是
from django.forms import ModelForm
from .models import ListModel
class ListForm(ModelForm):
class Meta:
model = ListModel
fields = ["task", "status"]
Run Code Online (Sandbox Code Playgroud)
我尝试在CharField (在 models.py 中)中添加以下小部件:
task = models.CharField(max_length=255, widget=models.TextInput(attrs={'autofocus': True})
Run Code Online (Sandbox Code Playgroud)
但它给出了一个 AttributeError:module 'django.db.models' has no attribute 'TextInput'
我还尝试将以下内容添加到ListForm 类(在 forms.py 中):
def __init__(self):
self.fields['task'].widget.attrs.update(autofocus = 'autofocus')
Run Code Online (Sandbox Code Playgroud)
虽然我没有收到任何错误,但是当我加载页面时,焦点也没有设置到任务 CharField …
django ×10
modelform ×10
python ×6
django-forms ×3
django-views ×2
datetime ×1
forms ×1
formset ×1
imagefield ×1
instance ×1
reverse ×1
save ×1
templates ×1
unit-testing ×1
validation ×1