我有一个这样的简单形式:
class RecordForm(Form):
notes = TextAreaField('Notes')
Run Code Online (Sandbox Code Playgroud)
我将数据记录在三个段落中,如下所示:
para1
para2
para3
Run Code Online (Sandbox Code Playgroud)
在模板中,我希望以只读方式查看该记录的内容.(不可编辑的形式)
记录是这种情况下包含数据的模型:
<td>{{ record.notes }}</td>
Run Code Online (Sandbox Code Playgroud)
- >
<td>para1 para2 para3</td>
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能显示多行?
我是TDD的新手.我已经开始在视图模型上创建我需要的属性作为普通的自动属性.
public string Firstname { get; set; }
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个测试
[TestMethod]
[Tag("Property")]
public void FirstNameTest()
{
ViewModel = new CustomerViewModel();
ViewModel.PropertyChanged += (s, e) =>
{
Assert.AreEqual("Firstname", e.PropertyName);
Assert.AreEqual("Test", ViewModel.Firstname);
};
ViewModel.Firstname = "Test";
}
Run Code Online (Sandbox Code Playgroud)
然后我会扩展实际的实现,使测试通过这样:
public string Firstname
{
get { return _contact.FirstName; }
set
{
if (_contact.FirstName == value)
return;
_contact.FirstName = value;
RaisePropertyChanged(() => Firstname);
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是测试仍然传递给Aut属性.任何提示,如何我可以改善我的过程?
我有一个像这样的Helper方法来获取PropertyName(试图避免魔术字符串)
public static string GetPropertyName<T>(Expression<Func<T>> expression)
{
var body = (MemberExpression) expression.Body;
return body.Member.Name;
}
Run Code Online (Sandbox Code Playgroud)
但有时我的PropertyNames也没有好好命名.所以我想宁愿使用DisplayAttribute.
[Display(Name = "Last Name")]
public string Lastname {get; set;}
Run Code Online (Sandbox Code Playgroud)
请注意我使用的是Silverlight 4.0.我无法找到通常的命名空间DisplayAttributeName属性.
如何更改我的方法来读取eproperty的属性(如果可用)?
非常感谢,
我正在使用Twitter bootstrap CSS.您可以在下面看到相同的代码与FireFox和Chrome的显示方式有何不同.
这很奇怪.Firebug告诉我,占位符的css设置为浅灰色:
:-moz-placeholder {
color: #999999;
}
Run Code Online (Sandbox Code Playgroud)
这应该影响所有元素中的所有占位符,因为它在Chrome中正确完成.但在Firefox中为什么要textareas正确应用,但input不是吗?我怎样才能解决这个问题?
<input id="id_referred_by" type="text" maxlength="50" name="referred_by" placeholder="...was referred by?">
<textarea id="id_contacts_interests" name="contacts_interests" cols="40" placeholder="Any particular interests?" rows="4"></textarea>
Run Code Online (Sandbox Code Playgroud)
铬:

火狐:

更新:
以下评论给了我一个想法:
Input不同于划掉textarea的color: #9999条目,这意味着有些东西会覆盖它.
select, textarea, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], .uneditable-input {
color: #555555;
display: inline-block;
font-size: 13px;
height: 18px;
line-height: 18px;
margin-bottom: 9px;
padding: 4px;
}
Run Code Online (Sandbox Code Playgroud)
事实上就是这样color: #555555;.当我在firebug中禁用它时,一切正常.Chrome怎么没关心这个,但Firefox呢?有关如何在两种浏览器中修复此问题的任 我还是css的新手.
我在模型中有一个下拉列表,用户不应该更改所选的值.我发现a disabled确实做到了我需要的东西.然而,这有点奇怪:
表单打开(GET)时第一次选择该值,用户无法更改该值.这很棒:

但是一旦出现验证错误unrelated field并且POST将用户返回到同一表单,之前的信息就会丢失.禁用的外键 - 下拉列表不再包含任何值,并且非常恼人.

我做了一些研究并在stackoverflow上找到了一些东西,并且似乎在禁用了foreignkey-dropdown小部件时,根本没有发回任何数据.虽然可以覆盖验证,但不会为下拉字段抛出任何错误,因为这里的第三个答案解释了.但是,如果任何其他不相关的字段抛出错误,则数据将丢失,因为禁用的下拉列表从未在第一时间向POST发送任何数据.
这是一个棘手的情况.
有没有办法将视图中的数据传递给request.POST?或者你的建议是什么?我可以使用a readonly而不是也可以使用disabled,但是用户可以更改下拉列表,这也很烦人.
有任何想法吗?非常感谢
编辑:
小修正:数据没有完全丢失.而是将选择错误地设置为初始虚拟值.
<select id="id_form-0-deal_type" name="form-0-deal_type" disabled="disabled">
<option selected="selected" value="">---------</option>
<option value="1">deal 1</option>
<option value="2">deal 2</option>
</select>
Run Code Online (Sandbox Code Playgroud)
更新:
弗朗西斯的解决方案看起来非常有前景.所以我尝试了他的第二个建议,并在html中添加了一个隐藏的输入字段,并将正确的值传递给POST.
问题是现在如何进行.我试图像这样在formset的形式的querydict中添加缺少的条目(为了设置正确的下拉值)
formset.forms[0].data['form-0-deal_type'] = formset.forms[0].data['form-0-hiddenfield']
Run Code Online (Sandbox Code Playgroud)
但它说 This QueryDict instance is immutable
唯一的另一种方法是使用常规表单集将其设置为Initials.不幸的是我使用的是modelformsets,它不支持现有表单的首字母.
如果没有其他解决方案,我开始将我的modelformset重构为常规formset.仍然愿意接受...
最终更新+解决方案:
无需将modelformset重构为常规fomsets.事实上,我非常不鼓励这样做,因为它带来了其他问题.modelformsets为您处理所有事情并填补缺失的部分.
实际的问题是QueryDict是不可变的,但这可以通过复制它们轻松解决:
formset = deal_formset(request.POST, queryset=formset_query)
if formset.is_valid():
pass
else:
new_post = request.POST.copy()
deal_types = dict()
for k,v in new_post.items():
if …Run Code Online (Sandbox Code Playgroud) 我希望在我的所有表行中实现统一的外观.当你看下面我的例子时,你可以看到中间的音符超过了4行而且不那么漂亮.

我希望将所有内容限制<td>为3行.
如果要显示的内容多于三行,那么它应该剪切内容... [click for more]并将内容放在可折叠元素中,这样当单击它时它将显示整个内容.
后者应该不是问题,但如何将内容限制为仅三行?我应该算一下角色来做出决定吗?有更好的策略吗?我顺便使用Django,但我很乐意使用javascript,jquery或任何css魔法来解决这个问题.
更新:
接受的答案非常好.然而,它带有一个警告,这是不容易解决的.如果你的邻居td已超过三行,而当前的td只有两行,我们将得到一个无限的while循环.

while($(this).innerHeight() / $(this).css('line-height').slice(0,-2) >= 3){ .. }
Run Code Online (Sandbox Code Playgroud)
由于$(this).innerHeight()相邻的单元格保持高度不能降低.我想如果有可能得到当前td的css并将其完全复制到一个单独的字段中,其中相邻的tds不会干扰,我们将获得最佳解决方案.
更新2:
正如阿萨德所提到的,解决方案是在内容周围放置一个div包装器td,并将类设置在div内部td而不是td自身上.它完美无瑕.
我试过了 git commit -v
ubuntu@ip:~/agile$ git commit -v
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: .htaccess
#
no changes added to commit (use "git add" and/or "git commit -a")
ubuntu@ip:~/agile$
Run Code Online (Sandbox Code Playgroud)
但它只是告诉我.htaccess已经改变了,但没有改变.我该如何实现这一目标?
更新: 在Aptana Studio中,可以在提交任何内容之前查看更改.回到我的问题,在实际提交之前,必须有一种方法可以看到原始状态的差异.也许有一个不同的命令.
有似乎是一个max_length对CharField只.但是min_length对于a来说TextField(),有没有办法强制执行100个字符TextField?
Pydantic 2.0 似乎发生了巨大的变化。
以前使用 FastAPI 和 Pydantic 1.XI 可以像这样定义模式,其中收据是可选的:
class VerifyReceiptIn(BaseModel):
device_id: str
device_type: DeviceType
receipt: Optional[str]
Run Code Online (Sandbox Code Playgroud)
然后在 FastAPI 端点中我可以这样做:
@router_verify_receipt.post(
"/",
status_code=201,
response_model=VerifyReceiptOut,
responses={201: {"model": VerifyReceiptOut}, 400: {"model": HTTPError}},
)
async def verify_receipt(body: VerifyReceiptIn):
auth_service = AuthService()
...
Run Code Online (Sandbox Code Playgroud)
没有体内收据的单元测试没问题,但现在 Pydantic 2.0 失败了。现在它声称需要收据并抛出 422 错误。
response = await client.post(
"/verify-receipt/",
headers={"api-token": "abc123"},
json={
"device_id": "u1",
"device_type": DeviceType.ANDROID.value,
},
)
Run Code Online (Sandbox Code Playgroud)
但这就是为什么我们有可选的。为什么我必须通过receipt=None身体?这并不理想,因为它会破坏生产中的一切。有没有解决的办法?谢谢
我已经像这样设置了Flask:
api = Api(app, decorators=[csrf_protect.exempt])
api.add_resource(FTRecordsAPI,
'/api/v1.0/ftrecords/<string:ios_sync_timestamp>',
endpoint="api.ftrecord")
Run Code Online (Sandbox Code Playgroud)
我想在内部重定向到端点api.ftrecord.
但是我尝试这样做的那一刻:
base_url = flask.url_for('api.ftrecord')
Run Code Online (Sandbox Code Playgroud)
我得到一个例外.
File "/Users/hooman/workspace/F11A/src/lib/werkzeug/routing.py", line 1620, in build
raise BuildError(endpoint, values, method)
BuildError: ('api.ftrecord', {}, None)
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
django ×3
python ×3
.net ×2
c# ×2
css ×2
flask ×2
silverlight ×2
fastapi ×1
forms ×1
git ×1
html ×1
javascript ×1
jinja2 ×1
jquery ×1
placeholder ×1
pydantic ×1
reflection ×1
tdd ×1
unit-testing ×1